Nyckelordet här är FÖRST . Du kan använda analytisk funktion FIRST_VALUE eller aggregerad konstruktion FIRST .
För FIRST eller LAST prestandan är aldrig sämre och ofta bättre än motsvarande FIRST_VALUE eller LAST_VALUE konstruera eftersom vi inte har en överflödig fönstersortering och som en konsekvens lägre utförandekostnad:
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 */
;
Sedan 12c introducerade operatorn LATERAL , samt CROSS/OUTER APPLY joins, gör det möjligt att använda en korrelerad underfråga på höger sida av 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 */
;