我已经提供了这个旧的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)
它做什么?有更合理/标准的写作方式吗?这里发生了什么?
答案 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; (我不知道它叫什么),但这更具可读性和清晰度