Oracle
 sql >> Database >  >> RDS >> Oracle

SQL:come limitare un join sulla prima riga trovata?

La parola chiave qui è PRIMA . Puoi usare la funzione analitica FIRST_VALUE o aggrega il costrutto FIRST .
Per FIRST o LAST le prestazioni non sono mai peggiori e spesso migliori dell'equivalente FIRST_VALUE o LAST_VALUE build perché non abbiamo un window sort superfluo e di conseguenza un minor costo di esecuzione:

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 */
;

Dal 12c ha introdotto l'operatore LATERAL , così come CROSS/OUTER APPLY join, consentono di utilizzare una sottoquery correlata sul lato destro di JOIN clausola:

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 */
;