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

SQL:hvordan begrænser man en joinforbindelse på den første fundne række?

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


  1. mysql-forespørgselsresultat i php-variabel

  2. Historie om dødvande i Oracle?

  3. Hvornår skal jeg indlejre PL/SQL BEGIN...END-blokke?

  4. Er der en præstationsforskel mellem CTE, Sub-Query, Temporary Table eller Table Variable?