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