奇怪/深奥的连接语法

时间:2017-05-25 14:23:28

标签: sql sql-server tsql join syntax

我已经提供了这个旧的SQL代码(表名更改)来复制,JOIN语法不是我以前见过的,并且很难谷歌:

select <stuff>

from A

inner join B
on A.ID = B.A_ID

inner join C  -- eh? No ON?

inner join D
ON C.C_ID = D.C_ID

ON B.C_ID = D.C_ID -- a second ON here? what?

当我看到代码时,我以为我会被发送破坏的代码并且它不会运行。

但确实如此。 (Sql Server 2012)

它做什么?有更合理/标准的写作方式吗?这里发生了什么?

2 个答案:

答案 0 :(得分:1)

虽然不寻常,但这是完全有效的tsql。通常,当您对一组内部相互连接的相关表进行外连接时,您会看到此方法。更好的恕我直言的方式来写这个:

inner join B
   on A.ID = B.A_ID
inner join (C inner join D ON C.C_ID = D.C_ID) 
   ON B.C_ID = D.C_ID 

这使得连接逻辑变得清晰 - 它也有助于读者。此外,它让读者知道开发人员故意这样做。因此,让这成为编码不良的一个例子。评论不寻常的事情。解释一下。让别人定期检查您的代码,以帮助改善您的风格和用法。

你可以写一个&#34;典型的&#34;通过重新排列from子句中表的顺序来设置样式 - 但我猜测当前版本对真实表名更具逻辑意义。

答案 1 :(得分:0)

我是由一位想出来的同事来管理的:

select <stuff>

from A

inner join B
on A.ID = B.A_ID

inner join ( C  -- put a bracket here...

inner join D
ON C.C_ID = D.C_ID

) -- and one here

ON B.C_ID = D.C_ID

或将其格式化得更好:

select <stuff>

from A

inner join B
on A.ID = B.A_ID

inner join ( 
    C
    inner join D
    ON C.C_ID = D.C_ID
)
ON B.C_ID = D.C_ID

我不熟悉这种&#34;子连接&#34; (我不知道它叫什么),但这更具可读性和清晰度