Oracle
 sql >> Base de données >  >> RDS >> Oracle

Est-ce que je comprends mal les jointures ?

Vous avez raison sur votre description de #1... le problème avec votre requête est à l'étape #2.

Lorsque vous effectuez une left join du royaume à (famille et espèce), vous demandez chaque royaume, même s'il n'y a pas de correspondance (famille et espèce) ... cependant, cela ne vous renverra aucune combinaison (famille et espèce) qui n'a pas de royaume correspondant.

Une requête plus précise serait :

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;

Notez que la left join a été remplacé par une full join ...

cependant, cela ne renvoie que les familles associées à une espèce... il ne renvoie aucune famille associée à des royaumes mais pas à des espèces.

Après avoir relu votre question, c'est en fait ce que vous vouliez...

EDIT :Après réflexion, vous pouvez réécrire votre requête comme suit :

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;

Je pense que ce serait préférable, car vous éliminez le RIGHT JOIN , qui sont généralement mal vus pour leur style médiocre... et les parenthèses, qui peuvent être difficiles à analyser correctement pour déterminer quel sera le résultat.