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

时间:2008-08-14 13:44:43

标签: sql

当我通过一个共同列加入三个或更多表时,我会写这样的查询:

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

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

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

这真的有什么好处吗?当然,优化者可以为自己暗示这一点吗?

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

8 个答案:

答案 0 :(得分:4)

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

现在无论如何整个语法都会出现。

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

这种语法不是源于联接语言之前的几天。不确定与之相关的问题,但肯定有更多支持连接表的语言结构。

答案 3 :(得分:1)

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

a = b = c

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

答案 4 :(得分:1)

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

再次,只是我的$ .02

答案 5 :(得分:1)

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

答案 6 :(得分:0)

这个问题与此处的问题类似,有一个非常深入的解释:

SQL question from Joel Spolsky article

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

答案 7 :(得分:-1)

该语法有其用途......有时您发现需要在多个字段上连接两个表