4

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

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

一位同事最近问我为什么我没有在这样的查询中明确加入传递闭包

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

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

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

4

8 回答 8

4

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

如今,无论如何,整个语法都会消失。

于 2008-08-14T13:53:33.963 回答
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
于 2008-08-14T14:30:39.007 回答
2

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

于 2008-08-14T13:46:23.790 回答
1

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

a = b = c

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

于 2008-08-14T13:48:30.777 回答
1

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

再一次,只是我的 $.02

于 2008-08-14T13:50:39.430 回答
1

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

于 2008-08-14T13:51:24.250 回答
0

这个问题与这里的这个问题相似,并有非常深入的解释:

来自 Joel Spolsky 文章的 SQL 问题

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

于 2009-02-06T11:10:02.300 回答
-1

不过,该语法有其用途……有时您会发现需要在多个字段上连接两个表

于 2008-08-14T17:46:36.303 回答