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
Freigeben: 2025-01-14 19:37:47
Original
338 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Fehler treten sowohl in MSSQL 2000/2008 als auch in MySQL auf. In MS2000 lautet der Fehler:

<code>列前缀'e1'与查询中使用的表名或别名不匹配。</code>
Nach dem Login kopieren

In MySQL lautet der Fehler:

<code>'on'子句中未知列'e1.managerEmployeeID'。</code>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage