iT邦幫忙

1

SQL Server JOIN問題

  • 分享至 

  • xImage

修改公司舊有的預存時發現了這段,這段在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又說這樣解釋不是正確的
有人能幫我解惑嗎

尼克 iT邦大師 1 級 ‧ 2025-04-01 17:18:08 檢舉
你知道LEFT JOIN and RIGHT JOIN 意思嗎?
https://en.wikipedia.org/wiki/Join_(SQL)
您好,我是想說標準寫法一個JOIN後面應該只會有一個ON才對?
他這樣兩個ON都放在RIGHT後面是可以的?
.

1 個回答

2
鬼王很慘
iT邦新手 2 級 ‧ 2025-04-01 21:32:13
最佳解答

原本是 a + (ca + csd)
被你改成 (a + csd) + ca

你應該想改成這樣

FROM ca
RIGHT OUTER JOIN csd ON ...
RIGHT OUTER JOIN a ON ...

題外話正確就不要改它/images/emoticon/emoticon37.gif


補充

原本的應該這樣理解

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 
  1. ca RIGHT JOIN csd
  2. a LEFT JOIN 以上結果

它是寫成子句的格式
等價於

FROM ca
RIGHT OUTER JOIN csd ON ...
RIGHT OUTER JOIN a ON ...
  1. ca RIGHT JOIN csd
  2. 以上結果 RIGHT JOIN a

因為由上往下執行,所以左右對調

您好,所以是ca的ON放在csd那段的話會變成ca跟csd是一個整體的操作?
我一直以為一個JOIN應該要配一個ON才對,第一次看到可以這樣寫的

froce iT邦大師 1 級 ‧ 2025-04-02 00:32:27 檢舉

一個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

這樣你應該就看懂了吧。

先乘除後加減~有括號優先處理/images/emoticon/emoticon06.gif

我要發表回答

立即登入回答