Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL:Wie beschränke ich einen Join auf die erste gefundene Zeile?

Das Schlüsselwort hier ist FIRST . Sie können die Analysefunktion FIRST_VALUE verwenden oder Aggregatkonstrukt FIRST .
Für FIRST oder LAST die Leistung ist nie schlechter und häufig besser als der entsprechende FIRST_VALUE oder LAST_VALUE konstruieren, weil wir keine überflüssige Fenstersortierung und damit einen geringeren Ausführungsaufwand haben:

select table_A.id, table_A.name, firstFromB.city 
from table_A 
join (
    select table_B.id2, max(table_B.city) keep (dense_rank first order by table_B.city) city
    from table_b
    group by table_B.id2
    ) firstFromB on firstFromB.id2 = table_A.id 
where 1=1 /* some conditions here */
;

Seit 12c den Operator LATERAL eingeführt hat , sowie CROSS/OUTER APPLY Joins ermöglichen es, eine korrelierte Unterabfrage auf der rechten Seite von JOIN zu verwenden Klausel:

select table_A.id, table_A.name, firstFromB.city 
from table_A 
cross apply (
    select max(table_B.city) keep (dense_rank first order by table_B.city) city
    from table_b
    where table_B.id2 = table_A.id 
    ) firstFromB
where 1=1 /* some conditions here */
;