sql >> Databasteknik >  >> RDS >> Oracle

SQL:hur begränsar jag en join på den första hittade raden?

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


  1. Metoder för att rangordna rader i SQL Server:ROW_NUMBER(), RANK(), DENSE_RANK() och NTILE()

  2. Hur man ställer in boolvärde i SQL

  3. MySQL Error 1153 - Fick ett paket större än 'max_allowed_packet' byte

  4. 6 sätt att välja dubbletter av rader i SQLite