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