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:
<code class="language-sql">CREATE TABLE Employee ( employeeID INT, name VARCHAR(255), managerEmployeeID INT )</code>
und Beispieldaten:
<code class="language-sql">INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary') INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1)</code>
Die folgende explizite JOIN-Abfrage ruft die Ergebnisse wie erwartet ab:
<code class="language-sql">SELECT e1.name, e2.name, e1Manager.name FROM Employee e1 CROSS JOIN Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID</code>
In ähnlicher Weise funktioniert auch diese implizite JOIN-Abfrage:
<code class="language-sql">SELECT e1.name, e2.name, e1Manager.name FROM Employee e1, Employee e2, Employee e1Manager WHERE e1.managerEmployeeID = e1Manager.employeeID</code>
Ungültiges SQL
Wenn Sie jedoch versuchen, implizite und explizite JOINs zu mischen:
<code class="language-sql">SELECT e1.name, e2.name, e1Manager.name FROM Employee e1, Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID</code>
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!