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

Ho frainteso i join?

Hai ragione sulla tua descrizione del n. 1... il problema con la tua query è al passaggio n. 2.

Quando esegui un left join da regno a (famiglia e specie), stai richiedendo ogni regno, anche se non c'è corrispondenza (famiglia e specie)... tuttavia, questo non ti restituirà alcuna combinazione (famiglia e specie) che non abbia una regno corrispondente.

Una query più ravvicinata sarebbe:

select *
    from reino r
         full join (
             familia f             
             right join especie e
                 on f.fnombre = e.efamilia
                 and f.freino = e.ereino
         ) on r.rnombre = f.freino 
           and r.rnombre = e.ereino;

Nota che il left join è stato sostituito con un full join ...

tuttavia, questo restituisce solo le famiglie associate a una specie... non restituisce le famiglie associate ai regni ma non le specie.

Dopo aver riletto la tua domanda, questo è in realtà quello che volevi...

EDIT:Dopo aver riflettuto ulteriormente, potresti riscrivere la tua query in questo modo:

select *
from 
    especie e
    left join familia f 
        on f.fnombre = e.efamilia
        and f.freino = e.ereino
    full join reino r
        on r.rnombre = f.freino 
        and r.rnombre = e.ereino;

Penso che questo sarebbe preferibile, perché elimini il RIGHT JOIN , che di solito sono disapprovati per essere di cattivo gusto... e le parentesi, che possono essere difficili da analizzare correttamente per determinare quale sarà il risultato.