【发布时间】:2022-01-06 10:44:49
【问题描述】:
带有 where 子句的交叉连接和带有 ON 子句的内连接一样吗?
Teradata SQL 的语法让我很困惑。这是一个包含两个表的简单 Teradata 查询:
SELECT pno, hours, lName
FROM Employee, Works_on
WHERE employee.ssn = works_on.essn
没有显式连接。笛卡尔积是隐含的,我认为 Where 子句定义了对该积的结果的过滤器。在 T-SQL 中,我将使用显式 ON 子句而不是 WHERE 子句。
我可以在 T-SQL 中执行此操作,但使用交叉连接似乎相当低效:
SELECT pno, hours, lName
FROM Employee CROSS JOIN Works_on
WHERE employee.ssn = works_on.essn
这就是我在 T-SQL 中实际使用的方法,使用显式内部连接
SELECT pno, hours, lName
FROM Employee INNER JOIN
Works_on
ON employee.ssn = works_on.essn
【问题讨论】:
-
我对 Teradata 一无所知,但我知道 MySQL 允许旧的“笛卡尔”语法,并且它正确地检测到它实际上是一个内部连接。事实上,CROSS JOIN、INNER JOIN 和逗号连接在 MySQL 中被视为同义词。
-
@siride 交叉联接在数学上与内部联接不同。
-
“正确检测到它实际上是一个内部连接”。这就是 MySQL 正在做的事情,不管数学定义如何。事实上,在 where 子句中带有过滤器的笛卡尔连接和内部连接的最终结果是相同的。应用过滤器的逻辑步骤无关紧要。
-
@siride 我哥特查。我确实得到了相同的结果,但我想知道一个是否更有效。如今,SQL 引擎可能会优化掉效率低下的问题。
-
隐式(逗号分隔)连接语法仍然是有效的标准 SQL(以及有效的 T-SQL),但常见的建议是使用 SQL-92 显式
JOIN语法。