我有這個查詢:
SELECT
u.UserId,
up.PhoneNumber AS OfficePhoneNumber,
up2.PhoneNumber
FROM
[OnlineTools].[App].[User] AS u
LEFT JOIN
[UserPhone] AS up ON up.UserId = u.UserId
AND up.PhoneType = 'Work'
LEFT JOIN
[UserPhone] AS up2 ON up2.UserId = u.UserId
AND up2.PhoneType = 'Mobile'
預期的結果是回傳三條記錄,當我UserPhone只離開加入一張表時它是正確的。
當我再次加入同一張桌子以獲取手機時,我得到的不是三條記錄,而是 18 條記錄。
有人可以讓我知道我可以在這里改進什么以獲得正確的記錄嗎?
uj5u.com熱心網友回復:
您正在獲得交叉連接(或笛卡爾結果)。對于“作業”條件中的每個條目,它會獲取“移動”中的所有條目,因為它們是左連接。然后,反之亦然,同時獲得所有移動,加入作業。
我建議將 ONCE 加入給定的電話表并僅過濾這兩種型別,但添加一列以顯示它是什么型別...類似于
SELECT
u.UserId,
up.PhoneNumber,
up.PhoneType
FROM
OnlineTools.App.User u
JOIN UserPhone up
ON u.UserId = up.UserId
AND up.PhoneType in ( 'Work', 'Mobile' )
這樣,它是檢索到的單個條目,并且該特定型別是顯示作業或移動的列。現在,如果您希望將作業電話列在第一位,只需添加
order by
up.PhoneType DESC
這將導致首先顯示所有 WORK 電話,然后是任何移動電話……但如果沒有作業電話,則只有移動電話會顯示(反之亦然)。
uj5u.com熱心網友回復:
假設每個用戶有 1 部作業電話和 1 部手機,您可以使用條件聚合而不是 2 個聯接:
SELECT u.UserId,
MAX(CASE WHEN up.PhoneType = 'Work' THEN up.PhoneNumber END) AS OfficePhoneNumber,
MAX(CASE WHEN up.PhoneType = 'Mobile' THEN up.PhoneNumber END) AS MobilePhoneNumber
FROM [OnlineTools].[App].[User] AS u LEFT JOIN [UserPhone] AS up
ON up.UserId = u.UserId
GROUP BY u.UserId;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/411911.html
標籤:
上一篇:觸發互斥布爾欄位
