Nøgleordet her er FØRST . Du kan bruge den analytiske funktion FIRST_VALUE
eller aggregeret konstruktion FIRST
.
For FIRST
eller LAST
ydeevnen er aldrig dårligere og ofte bedre end den tilsvarende FIRST_VALUE
eller LAST_VALUE
konstruere, fordi vi ikke har en overflødig vinduessortering og som følge heraf lavere udførelsesomkostninger:
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 */
;
Siden 12c introducerede operatoren LATERAL
, samt CROSS/OUTER APPLY
joins, gør det muligt at bruge en korreleret underforespørgsel på højre side af JOIN
klausul:
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 */
;