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可能会遇到问题。