SQL中显式联接传递闭包的优点是什么?

时间:2020-03-05 18:39:37  来源:igfitidea点击:

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

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的快速和肮脏示例,用于清理它

解决方案

回答

这种语法不是源于加入该语言之前的日子。不确定与之相关的问题,但肯定有更多的语言构造可用于联合表。

回答

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

a = b = c

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

回答

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

同样,只有我的$ .02

回答

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

回答

在当今的数据库引擎中,我们不需要这样做,但是有一段时间,类似的事情会给查询优化器更多有关可能的索引路径的提示,从而使结果更快。

这些天来,整个语法反正一去不复返了。

回答

这是肮脏的,邪恶的传统语法。我们将其写为

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

回答

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

回答

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

Joel Spolsky文章中的SQL问题

简短的答案是,transitiiv属性的显式声明可以加快查询速度。这是因为查询优化不是一件容易的事,并且某些SQL Server可能会遇到问题。