sql連接 - 奇怪/深奧的連接語法




sql合併 (2)

我是由一個弄清楚的同事跑過去的:

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

我不熟悉這種“子連接”(我不知道它叫什麼),但是這更可讀和清晰

我已經提供了這個舊的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)

它有什麼作用? 有沒有更合理/標準的寫作方式? 這裡發生了什麼事?


雖然不尋常的,這是完全有效的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 

這使得連接邏輯清晰 - 它也有助於讀者。 另外,它可以讓讀者知道,開發者是故意這樣做的。 所以,讓這是一個糟糕的編碼的例子。 評論一些不尋常的事情。 解釋一下。 讓別人定期檢查你的代碼,以幫助改善你的風格和使用。

你可以通過重新排列from子句中的表的順序來以“典型”的風格來寫這個,但是我猜測當前版本對於真正的表名是更合理的。





syntax