Die alte Syntax, bei der nur die Tabellen WHERE
aufgelistet und die Verknüpfungskriterien mithilfe der Klausel angegeben werden, ist in den meisten modernen Datenbanken veraltet.
Es ist nicht nur für die Show gedacht, die alte Syntax kann mehrdeutig sein, wenn Sie sowohl INNER- als auch OUTER-Joins in derselben Abfrage verwenden.
Lassen Sie mich Ihnen ein Beispiel geben.
Angenommen, Sie haben 3 Tabellen in Ihrem System:
Company
Department
Employee
Jede Tabelle enthält zahlreiche miteinander verknüpfte Zeilen. Sie haben mehrere Unternehmen, und jedes Unternehmen kann mehrere Abteilungen haben, und jede Abteilung kann mehrere Mitarbeiter haben.
Ok, jetzt möchten Sie Folgendes tun:
Listen Sie alle Unternehmen auf und schließen Sie alle Abteilungen und Mitarbeiter ein. Beachten Sie, dass einige Unternehmen noch keine Abteilungen haben, stellen Sie jedoch sicher, dass Sie diese auch einbeziehen. Stellen Sie sicher, dass Sie nur Abteilungen mit Mitarbeitern abrufen, aber immer alle Unternehmen auflisten.
Also machst du das:
SELECT * -- for simplicity
FROM Company, Department, Employee
WHERE Company.ID *= Department.CompanyID
AND Department.ID = Employee.DepartmentID
Beachten Sie, dass der letzte eine innere Verknüpfung ist, um die Kriterien zu erfüllen, nach denen Sie nur Abteilungen mit Personen wünschen.
Ok, was passiert jetzt? Das Problem ist, dass es vom Datenbankmodul, dem Abfrageoptimierer, den Indizes und den Tabellenstatistiken abhängt. Lassen Sie mich erklären.
Wenn der Abfrageoptimierer feststellt, dass der Weg dazu darin besteht, zuerst ein Unternehmen zu übernehmen, dann die Abteilungen zu finden und dann eine innere Verbindung mit den Mitarbeitern herzustellen, erhalten Sie keine Unternehmen, die keine Abteilungen haben.
Der Grund dafür ist, dass die WHERE
Klausel bestimmt, welche Zeilen im Endergebnis landen, nicht einzelne Teile der Zeilen.
In diesem Fall ist die Spalte Department.ID aufgrund des linken Joins NULL. Wenn es also um INNER JOIN to Employee geht, gibt es keine Möglichkeit, diese Einschränkung für die Employee-Zeile zu erfüllen, und dies wird auch nicht der Fall sein erscheinen.
Wenn sich das Abfrageoptimierungsprogramm dagegen entscheidet, zuerst den Join von Abteilungsmitarbeitern in Angriff zu nehmen und dann einen Link-Join mit den Unternehmen durchzuführen, werden diese angezeigt.
Die alte Syntax ist also nicht eindeutig. Es gibt keine Möglichkeit, anzugeben, was Sie möchten, ohne sich mit Abfragehinweisen zu befassen, und einige Datenbanken haben überhaupt keine Möglichkeit.
Geben Sie die neue Syntax ein, mit der Sie auswählen können.
Wenn Sie beispielsweise alle Unternehmen möchten, wie in der Problembeschreibung angegeben, würden Sie Folgendes schreiben:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID
Hier geben Sie an, dass der Join von Abteilungsmitarbeitern als ein Join ausgeführt werden soll, und verbinden dann die Ergebnisse mit den Unternehmen.
Angenommen, Sie möchten nur Abteilungen, deren Name den Buchstaben X enthält. Auch hier besteht bei Joins im alten Stil die Gefahr, dass Sie das Unternehmen verlieren. Wenn es keine Abteilungen mit einem X im Namen hat, aber mit der neuen Syntax können Sie dies tun:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID AND Department.Name LIKE '%X%'
Diese zusätzliche Klausel wird für die Verknüpfung verwendet, ist jedoch kein Filter für die gesamte Zeile. Die Zeile wird möglicherweise mit Unternehmensinformationen angezeigt, enthält jedoch möglicherweise NULL-Werte in allen Abteilungs- und Mitarbeiterspalten für diese Zeile, da für diese Firma keine Abteilung mit einem X im Namen vorhanden ist. Dies ist mit der alten Syntax schwierig.
Aus diesem Grund hat Microsoft unter anderen Anbietern die alte äußere Join-Syntax, jedoch nicht die alte innere Join-Syntax seit SQL Server 2005 und höher abgelehnt. Die einzige Möglichkeit, mit einer Datenbank zu kommunizieren, die unter Microsoft SQL Server 2005 oder 2008 unter Verwendung der Outer Join-Syntax im alten Stil ausgeführt wird, besteht darin, diese Datenbank in den 8.0-Kompatibilitätsmodus (auch bekannt als SQL Server 2000) zu versetzen.
Darüber hinaus war die alte Methode, eine Reihe von Tabellen mit einer Reihe von WHERE-Klauseln auf den Abfrageoptimierer zu werfen, vergleichbar mit der Aussage "Hier sind Sie, tun Sie das Beste, was Sie können". Mit der neuen Syntax muss der Abfrageoptimierer weniger arbeiten, um herauszufinden, welche Teile zusammenpassen.
Da haben Sie es also.
LEFT and INNER JOIN ist die Welle der Zukunft.