Gemischter impliziter und expliziter JOIN
Obwohl dies eine offene Frage ist, führt das Mischen impliziter und expliziter JOINs in SQL zu einer ungültigen Syntax. Während explizite und implizite JOINs einzeln funktionieren können, kann ihre Kombination zu Fehlern führen.
Betrachten Sie das folgende Beispielmuster:
CREATE TABLE Employee ( employeeID INT, name VARCHAR(255), managerEmployeeID INT )
und Beispieldaten:
INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary') INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1)
Die folgende explizite JOIN-Abfrage ruft die Ergebnisse wie erwartet ab:
SELECT e1.name, e2.name, e1Manager.name FROM Employee e1 CROSS JOIN Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID
In ähnlicher Weise funktioniert auch diese implizite JOIN-Abfrage:
SELECT e1.name, e2.name, e1Manager.name FROM Employee e1, Employee e2, Employee e1Manager WHERE e1.managerEmployeeID = e1Manager.employeeID
Ungültiges SQL
Wenn Sie jedoch versuchen, implizite und explizite JOINs zu mischen:
SELECT e1.name, e2.name, e1Manager.name FROM Employee e1, Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID
Fehler treten sowohl in MSSQL 2000/2008 als auch in MySQL auf. In MS2000 lautet der Fehler:
<code>列前缀'e1'与查询中使用的表名或别名不匹配。</code>
In MySQL lautet der Fehler:
<code>'on'子句中未知列'e1.managerEmployeeID'。</code>
Warum ist diese Syntax ungültig?
Der SQL-Standard schreibt vor, dass das Schlüsselwort JOIN eine höhere Priorität hat als Kommas. Allerdings können Tabellenaliase erst verwendet werden, nachdem die entsprechende Tabelle in der FROM-Klausel ausgewertet wurde.
In der gemischten JOIN-Abfrage bezieht sich der JOIN...ON-Ausdruck auf e1, aber e1 wurde noch nicht ausgewertet, da die durch Kommas getrennte Liste der Tabellen noch nicht verarbeitet wurde.
Extra: Hibernate erzwingen, explizites JOIN zu verwenden
Leider habe ich bei meiner Recherche in der HQL-Dokumentation von Hibernate keine Informationen darüber gefunden, wie man die Verwendung von explizitem JOIN erzwingen kann.
Das obige ist der detaillierte Inhalt vonWarum ist das Mischen impliziter und expliziter JOINs in SQL ungültige Syntax?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!