修改公司舊有的預存時發現了這段,這段在RIGHT OUTER JOIN後面使用了兩個ON這樣看起來應該不是標準寫法,但執行出來的結果卻是正確的
FROM #t_CP903 a
LEFT OUTER JOIN dbo.CP_AreaCode ca
RIGHT OUTER JOIN dbo.CP_OrderShippingData csd WITH (nolock) ON ca.AreaCode = csd.Area ON a.SalesNoteNO = csd.SalesNoteNO AND a.ItemNO = csd.ItemNO AND a.LotNO = csd.LotNO
如果把它改成這樣看起來應該順序是正確的,某些資料卻遺失了
FROM #t_CP903 a
RIGHT OUTER JOIN dbo.CP_OrderShippingData csd WITH (nolock) ON a.SalesNoteNO = csd.SalesNoteNO AND a.ItemNO = csd.ItemNO AND a.LotNO = csd.LotNO
LEFT OUTER JOIN dbo.CP_AreaCode ca ON ca.AreaCode = csd.Area
詢問ChatGPT和Grok都給出不同的解釋
GPT說是先宣告LEFT JOIN CP_AreaCode還沒開始做連接,在RIGHT JOIN這段時才做連接,Grok又說這樣解釋不是正確的
有人能幫我解惑嗎
原本是 a + (ca + csd)
被你改成 (a + csd) + ca
你應該想改成這樣
FROM ca
RIGHT OUTER JOIN csd ON ...
RIGHT OUTER JOIN a ON ...
題外話正確就不要改它
補充
原本的應該這樣理解
SELECT *
FROM #t_CP903 a
LEFT OUTER JOIN (
dbo.CP_AreaCode ca
RIGHT OUTER JOIN dbo.CP_OrderShippingData csd WITH (nolock)
ON ca.AreaCode = csd.Area
)
ON a.SalesNoteNO = csd.SalesNoteNO
AND a.ItemNO = csd.ItemNO
AND a.LotNO = csd.LotNO
RIGHT JOIN
csdLEFT JOIN
以上結果它是寫成子句的格式
等價於
FROM ca
RIGHT OUTER JOIN csd ON ...
RIGHT OUTER JOIN a ON ...
RIGHT JOIN
csdRIGHT JOIN
a因為由上往下執行,所以左右對調
您好,所以是ca的ON放在csd那段的話會變成ca跟csd是一個整體的操作?
我一直以為一個JOIN應該要配一個ON才對,第一次看到可以這樣寫的
一個JOIN應該要配一個ON才對
你不覺得前面的 LEFT OUTER JOIN 很可憐嗎?
被你偏心的把他的on給了後面的 RIGHT OUTER JOIN
LEFT OUTER JOIN dbo.CP_AreaCode ca
(RIGHT OUTER JOIN dbo.CP_OrderShippingData csd WITH (nolock) ON ca.AreaCode = csd.Area)
ON a.SalesNoteNO = csd.SalesNoteNO
這樣你應該就看懂了吧。
先乘除後加減~有括號優先處理