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

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 @斯图 为了清理它

有帮助吗?

解决方案

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

如今,整个语法无论如何都会被淘汰。

其他提示

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

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

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

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

再说一次,只是我的 $.02

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

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

a = b = c

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

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

Joel Spolsky 文章中的 SQL 问题

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top