SQL中显式Join Transitive Closure的优点是啥?

Posted

技术标签:

【中文标题】SQL中显式Join Transitive Closure的优点是啥?【英文标题】:What are the advantages of explicit Join Transitive Closure in SQL?SQL中显式Join Transitive Closure的优点是什么? 【发布时间】:2008-08-14 13:44:43 【问题描述】:

当我通过一个公共列将三个或更多表连接在一起时,我会这样编写查询:

SELECT *
FROM   a, b, c
WHERE  a.id = b.id
AND    b.id = c.id

一位同事最近问我为什么我没有在这样的查询中明确Join Transitive Closure

SELECT *
FROM   a, b, c
WHERE  a.id = b.id
AND    b.id = c.id
AND    c.id = a.id

这真的有什么好处吗?优化器肯定可以为自己暗示这一点吗?

编辑:我知道这是邪恶的语法,但它是合法遗留代码 +1 @Stu 清理它的快速而肮脏的例子

【问题讨论】:

【参考方案1】:

您不需要在当今的数据库引擎中执行此操作,但曾经有一段时间这样的事情会为查询优化器提供更多关于可能的索引路径的提示,从而更快地获得结果。

这些天来,无论如何,整个语法都会消失。

【讨论】:

【参考方案2】:

这是肮脏、邪恶的遗留语法。你把它写成

Select
  *  -- Oh, and don't ever use *, either
From
  A 
  Inner Join B On A.ID = B.ID
  Inner Join C On B.ID = C.ID

【讨论】:

【参考方案3】:

没有这种语法源于连接出现在该语言之前的日子。不确定与它相关的问题,但肯定有更支持连接表的语言结构。

【讨论】:

【参考方案4】:

我只想说,这种加盟简直是天作之合。 考虑一下;加入和过滤的条件在 where 语句中混合在一起。 当您需要连接 20 个表并过滤 15 个值时会发生什么?

再一次,只是我的 $.02

【讨论】:

【参考方案5】:

在 Microsoft SQL 中,这两个查询的查询计划是相同的 - 它们以相同的方式执行。

【讨论】:

【参考方案6】:

如果您从数学的角度来看,您的示例应该会产生相同的结果。

a = b = c

因此您的第一个示例将产生与第二个示例相同的结果,因此无需做额外的工作。

【讨论】:

【参考方案7】:

这个问题和这里的这个问题类似,有非常深入的解释:

SQL question from Joel Spolsky article

简短的回答是,transitiv 属性的显式声明可能会加快查询速度。这是因为查询优化不是一项简单的任务,某些 SQL 服务器可能会遇到问题。

【讨论】:

【参考方案8】:

虽然这种语法有其用途...有时您会发现需要在多个字段上连接两个表

【讨论】:

您可以在常规连接语法 FROM table1 t1 中执行此操作。在 t1.field1 = t2.field1 和 t.field2 = t2.field2 上加入 table2 t2

以上是关于SQL中显式Join Transitive Closure的优点是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 DataFrameMapper 中显式删除列

为啥在 Haskell 中显式推导 Show/Read?

为啥在 OpenGL 中显式管理矩阵更好?

在 QT 中显式调用paintGL

在 mvvm 中显式保存

在 Java 中显式调用默认方法