sql >> Database >  >> RDS >> Oracle

SQL:hoe beperk je een join op de eerst gevonden rij?

Het sleutelwoord hier is EERSTE . U kunt de analytische functie FIRST_VALUE . gebruiken of aggregatieconstructie FIRST .
Voor FIRST of LAST de prestatie is nooit slechter en vaak beter dan de equivalente FIRST_VALUE of LAST_VALUE constructie omdat we geen overbodige venstersortering hebben en als gevolg daarvan lagere uitvoeringskosten:

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

Sinds 12c de operator LATERAL introduced heeft geïntroduceerd , evenals CROSS/OUTER APPLY joins, maak het mogelijk om een ​​gecorreleerde subquery te gebruiken aan de rechterkant van JOIN clausule:

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 8 Het gemiddelde berekenen door te partitioneren op datum

  2. sql verwijder alle rijen ouder dan 30 dagen

  3. Prestatieprobleem doorgestuurde records identificeren en oplossen

  4. MySQL GUID/UUID's opslaan