当我通过一个共同列加入三个或更多表时,我会写这样的查询:
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
答案 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)
该语法有其用途......有时您发现需要在多个字段上连接两个表