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

SQL中显式连接传递闭包的优点是什么?,sql,Sql,当我通过一个公共列将三个或更多表连接在一起时,我会这样编写查询: 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 一位同事最近问我为什么在我的查询中不执行显式连接传递闭包,如下所示: SELECT * FROM a, b, c WHERE a.id =

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

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
一位同事最近问我为什么在我的查询中不执行显式连接传递闭包,如下所示:

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@清理示例

否此语法源于Join出现在语言中之前的几天。不确定与之相关的问题,但肯定有一些语言结构更受连接表的支持。

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

a=b=c


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

我只想说,这种连接是魔鬼的工作。
想想看,;连接和筛选的条件在where语句中混合在一起。
当您需要跨20个表联接并筛选15个值时会发生什么情况


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

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


现在,整个语法都过时了。

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


这种语法也有它的用途。。。有时您会发现需要在多个字段上连接两个表

此问题与此处的问题类似,并有非常深入的解释:


简而言之,transitiv属性的显式声明可能会加快查询速度。这是因为查询优化不是一项简单的任务,某些SQL Server可能会遇到问题。

您可以使用表1 t1中的常规联接语法来完成这项任务。在t1.field1=t2.field1和t.field2=t2.field2上连接表2 t2