混合隐式和显式JOIN
尽管这是一个悬而未决的问题,但在SQL中混合隐式和显式JOIN会导致无效语法。虽然显式和隐式JOIN可以单独工作,但组合它们可能会导致错误。
考虑以下示例模式:
<code class="language-sql">CREATE TABLE Employee ( employeeID INT, name VARCHAR(255), managerEmployeeID INT )</code>
以及示例数据:
<code class="language-sql">INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary') INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1)</code>
以下显式JOIN查询检索到的结果符合预期:
<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>
同样,此隐式JOIN查询也能正常工作:
<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
但是,当尝试混合隐式和显式JOIN时:
<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>
MSSQL 2000/2008和MySQL都会出现错误。在MS2000中,错误是:
<code>列前缀'e1'与查询中使用的表名或别名不匹配。</code>
在MySQL中,错误是:
<code>'on'子句中未知列'e1.managerEmployeeID'。</code>
为什么此语法无效?
SQL标准规定JOIN关键字的优先级高于逗号。但是,表别名只能在FROM子句中评估相应的表之后才能使用。
在混合JOIN查询中,JOIN...ON表达式引用e1,但e1尚未被评估,因为逗号分隔的表列表尚未被处理。
额外内容:强制Hibernate使用显式JOIN
不幸的是,我对Hibernate的HQL文档的研究并没有发现任何关于如何强制使用显式JOIN的信息。
以上是为什么在 SQL 中混合隐式和显式 JOIN 语法无效?的详细内容。更多信息请关注PHP中文网其他相关文章!