Maison >base de données >tutoriel mysql >Pourquoi le mélange de JOIN implicites et explicites dans la syntaxe SQL n'est-il pas valide ?

Pourquoi le mélange de JOIN implicites et explicites dans la syntaxe SQL n'est-il pas valide ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-14 19:37:47403parcourir

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

JOIN mixte implicite et explicite

Bien qu'il s'agisse d'une question ouverte, le mélange de JOIN implicites et explicites dans SQL entraîne une syntaxe invalide. Bien que les JOIN explicites et implicites puissent fonctionner individuellement, leur combinaison peut entraîner des erreurs.

Considérez l'exemple de modèle suivant :

<code class="language-sql">CREATE TABLE Employee (
    employeeID INT,
    name VARCHAR(255),
    managerEmployeeID INT   
)</code>

et exemples de données :

<code class="language-sql">INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary')
INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1)</code>

La requête JOIN explicite suivante récupère les résultats comme prévu :

<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>

De même, cette requête JOIN implicite fonctionne également :

<code class="language-sql">SELECT e1.name,
       e2.name,
       e1Manager.name
  FROM Employee e1,
       Employee e2,
       Employee e1Manager
 WHERE e1.managerEmployeeID = e1Manager.employeeID</code>

SQL invalide

Cependant, lorsque vous essayez de mélanger des JOIN implicites et explicites :

<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>

Des erreurs se produiront à la fois dans MSSQL 2000/2008 et MySQL. Dans MS2000, l'erreur est :

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

Dans MySQL, l'erreur est :

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

Pourquoi cette syntaxe est-elle invalide ?

Le standard SQL stipule que le mot-clé JOIN a une priorité plus élevée que les virgules. Cependant, les alias de table ne peuvent être utilisés qu'après que la table correspondante a été évaluée dans la clause FROM.

Dans la requête mixte JOIN, l'expression JOIN...ON fait référence à e1, mais e1 n'a pas encore été évalué car la liste de tables séparées par des virgules n'a pas encore été traitée.

Extra : Forcer Hibernate à utiliser JOIN explicite

Malheureusement, mes recherches dans la documentation HQL d'Hibernate n'ont révélé aucune information sur la façon de forcer l'utilisation de JOIN explicite.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn