Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verstehe ich Joins falsch?

Sie haben Recht mit Ihrer Beschreibung von Nr. 1 ... das Problem mit Ihrer Abfrage liegt bei Schritt Nr. 2.

Wenn Sie einen left join ausführen Von Königreich bis (Familie &Art) fordern Sie jedes Königreich an, auch wenn es keine passende (Familie &Art) gibt ... dies wird Ihnen jedoch keine (Familie &Art)-Kombination zurückgeben, die kein hat passendes Königreich.

Eine nähere Abfrage wäre:

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;

Beachten Sie, dass der left join wurde durch einen full join ersetzt ...

dies gibt jedoch nur Familien zurück, die mit einer Spezies assoziiert sind ... es gibt keine Familien zurück, die mit Königreichen, aber nicht mit Spezies assoziiert sind.

Nachdem Sie Ihre Frage noch einmal gelesen haben, ist dies eigentlich das, was Sie wollten ...

BEARBEITEN:Bei weiterem Nachdenken könnten Sie Ihre Abfrage folgendermaßen umschreiben:

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;

Ich denke, das wäre vorzuziehen, weil Sie den RIGHT JOIN eliminieren , die normalerweise als schlechter Stil verpönt sind ... und die Klammern, die für Leute schwierig zu analysieren sind, um das Ergebnis zu bestimmen.