2016-05-10 4 views
1

Ich habe eine Abfrage, wo Iam versucht, den max (Datum) -Wert von einer anderen Tabelle als Join-Bedingung verwendet werden.make max() -Funktion schneller, wenn als inline Abfrage Join-Bedingung verwendet

SELECT a.col1, a.col2 
    FROM tablea a, 
     tableb b 
WHERE a.pk_id = b.fk_id 
    AND a.effdt = (SELECT MAX(effdt) 
        FROM tablea c 
        where c.id= a.id 
        and c.effdt <= sysdate 
       ) 

Hier ist ein Index bereits auf dem TableA für effdt Spalte erstellt noch die Abfrage Rückgabewerte lange dauert. jede Hilfe, sie besser zu verbinden, wäre großartig.

+0

Sie haben ein zusätzliches Komma nach 'TableB b' und Sie können nicht 'c. *' auswählen, da der Alias ​​'c' in der korrelierten Unterabfrage und nicht in der äußeren Abfrage definiert ist. – MT0

+0

änderte die Abfrage – waiting

Antwort

1

Verwenden Sie die RANK() analytische Funktion die korrelierte Unterabfrage zu beseitigen:

SELECT * 
FROM (
    SELECT a.*, 
     RANK() OVER (PARTITION BY a.id ORDER BY a.effdt DESC) AS rnk 
    FROM tablea a 
     INNER JOIN 
     tableb b 
     ON (a.pk_id = b.fk_id) 
    WHERE a.effdt <= SYSDATE 
) 
WHERE rnk = 1; 
+0

danke MT0 es hat funktioniert – waiting

0

Abgesehen von der index wie Markus vorgeschlagen, versuchen Sie dies. IMO tritt als Unterabfrage besser arbeiten (für die Szenarien habe ich versucht)

SELECT a.* 
FROM tablea a 
INNER JOIN tableb b 
ON a.pk_id = b.fk_id 
INNER JOIN 
    (SELECT MAX(effdt) AS effdt 
    FROM tablea 
    WHERE effdt <= sysdate 
    ) c ON c.id = a.id 
    AND c.effdt = a.effdb 
+0

danke für die Antwort, aber können Sie mir in einigen Punkten helfen, ich bin nicht sicher, wie dies hier "ON c.id = a.id" funktioniert, die nicht ausgewählt ist und warum wir den effdt Teil beitreten . – waiting

+0

Mein schlechtes. Sie sollten 'a. *' In auswählen. Die Abfrage wurde geändert. – Utsav