题
当我通过公共列将三个或更多表连接在一起时,我会像这样编写查询:
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
因此,您的第一个示例将产生与第二个示例相同的结果,因此无需执行额外的工作。
这个问题与这里的问题类似,有一个非常深入的解释:
简短的答案是,显式声明传递属性可以加快查询速度。这是因为查询优化不是一项简单的任务,某些 SQL 服务器可能会出现问题。
不过,该语法有其用途......有时您发现需要在多个字段上连接两个表
不隶属于 StackOverflow