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
Libérer: 2025-01-14 19:37:47
original
405 Les gens l'ont consulté

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 :

CREATE TABLE Employee (
    employeeID INT,
    name VARCHAR(255),
    managerEmployeeID INT   
)
Copier après la connexion

et exemples de données :

INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary')
INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1)
Copier après la connexion

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

SELECT e1.name,
       e2.name,
       e1Manager.name
  FROM Employee e1
 CROSS JOIN Employee e2
 INNER JOIN Employee e1Manager
    ON e1.managerEmployeeID = e1Manager.employeeID
Copier après la connexion

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

SELECT e1.name,
       e2.name,
       e1Manager.name
  FROM Employee e1,
       Employee e2,
       Employee e1Manager
 WHERE e1.managerEmployeeID = e1Manager.employeeID
Copier après la connexion

SQL invalide

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

SELECT e1.name, 
       e2.name, 
       e1Manager.name
  FROM Employee e1,
       Employee e2
 INNER JOIN Employee e1Manager 
    ON e1.managerEmployeeID = e1Manager.employeeID
Copier après la connexion

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

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

Dans MySQL, l'erreur est :

<code>'on'子句中未知列'e1.managerEmployeeID'。</code>
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal