【问题标题】:Cartesian Product the same as an explicit join in Teradata SQL and T-SQL?笛卡尔积与 Teradata SQL 和 T-SQL 中的显式联接相同吗?
【发布时间】: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 语法。

标签: sql teradata


【解决方案1】:

正确的语法是使用显式的JOIN 语法。我想你可能已经意识到这一点。 Teradata 支持这种语法并且已经有很长时间了。

更重要的一点是,您不应将查询的表达式与执行混淆。所以,你可以写:

SELECT pno, hours, lName
FROM Employee CROSS JOIN
     Works_on
WHERE employee.ssn = works_on.essn;

SQL 查询描述的是结果集,而不是处理方法。这个查询的结果和INNER JOIN一样:

SELECT pno, hours, lName
FROM Employee INNER JOIN
     Works_on
     ON employee.ssn = works_on.essn;

只有查询的表达方式不同。

使用CROSS JOIN(虽然不是首选版本)并不意味着引擎实际上会生成笛卡尔积然后过滤结果。事实上,这应该与内部连接具有相同的执行计划——编译器和优化器在 SQL Server 和 Teradata 中都非常智能。

【讨论】:

  • "正确的语法是使用显式的 JOIN 语法。我想您可能已经意识到这一点。" ——你认为我为什么知道?
【解决方案2】:

语法:

SELECT pno, hours, lName FROM Employee, Works_on WHERE employee.ssn = works_on.essn

和普通的JOIN一样,只是转写不同,跟Oracle一样;没有带有后续过滤器的笛卡尔积。 查看它的解释计划。

diagnostic helpstats on for session;
explain
SELECT pno, hours, lName FROM Employee, Works_on WHERE employee.ssn = works_on.essn;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    相关资源
    最近更新 更多