La raison pour laquelle le mélange de jointures implicites et explicites dans SQL entraîne des erreurs de syntaxe
Dans la programmation de bases de données, l'utilisation de jointures implicites et explicites peut causer des problèmes. Cet article fournit un examen approfondi des exceptions de syntaxe SQL provoquées par un mélange incorrect de ces types de connexion.
Exemple de schéma et de données
Considérez le modèle simplifié suivant :
<code class="language-sql">CREATE TABLE Employee ( employeeID INT, name VARCHAR(255), managerEmployeeID INT ); INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary'); INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1);</code>
Requête valide
L'utilisation de jointures explicites ou implicites générera respectivement des instructions SQL valides :
<code class="language-sql">-- 显式 JOIN SELECT e1.name, e2.name, e1Manager.name FROM Employee e1 CROSS JOIN Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID; -- 隐式 JOIN SELECT e1.name, e2.name, e1Manager.name FROM Employee e1, Employee e2, Employee e1Manager WHERE e1.managerEmployeeID = e1Manager.employeeID;</code>
Requête invalide
Cependant, mélanger des jointures explicites et implicites génère des erreurs dans SQL Server et MySQL :
<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>
Cause première de la syntaxe invalide
Cette erreur de syntaxe est due au fait que le mot-clé JOIN a priorité sur les virgules dans SQL. Par conséquent, l'expression JOIN est traitée avant que la référence de table (alias) ne soit résolue. Par conséquent, la référence à e1 dans la condition JOIN (e1.managerEmployeeID) n’est pas valide car e1 n’a pas été défini dans la référence de table séparée par des virgules précédente.
Y a-t-il une solution ?
Concernant la question supplémentaire, il ne ressort pas clairement des informations fournies s'il est possible de forcer Hibernate à n'utiliser que des connexions explicites. Des recherches supplémentaires sont nécessaires pour explorer cette possibilité.
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!