首页 > 数据库 > mysql教程 > 为什么在 SQL 中混合隐式和显式 JOIN 语法无效?

为什么在 SQL 中混合隐式和显式 JOIN 语法无效?

Susan Sarandon
发布: 2025-01-14 19:37:47
原创
338 人浏览过

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

混合隐式和显式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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板