Heim >Datenbank >MySQL-Tutorial >Warum ist das Mischen impliziter und expliziter JOINs in SQL ungültige Syntax?

Warum ist das Mischen impliziter und expliziter JOINs in SQL ungültige Syntax?

Susan Sarandon
Susan SarandonOriginal
2025-01-14 19:37:47388Durchsuche

Why is Mixing Implicit and Explicit JOINs in SQL Invalid Syntax?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn