SELECT KundeID, Kundenummer, Fornavn, Efternavn, Adresse, Postnummer, [By]
FROM dbo.Kundeliste
INNER JOIN Ordreliste
ON Ordreliste.KundeID<>Kundeliste.KundeID
我沒有得到正確的輸出。我需要所有尚未從我的客戶列表中下訂單的客戶這有什麼問題?
SELECT KundeID, Kundenummer, Fornavn, Efternavn, Adresse, Postnummer, [By]
FROM dbo.Kundeliste
INNER JOIN Ordreliste
ON Ordreliste.KundeID<>Kundeliste.KundeID
我沒有得到正確的輸出。我需要所有尚未從我的客戶列表中下訂單的客戶這有什麼問題?
您需要一個anti semi join。執行此操作的三種最常見的方法是在NULL
上過濾NOT EXISTS
,NOT IN
和OUTER JOIN
。
我一般使用NOT EXISTS
,因爲它避免了與NULL
有關的問題,即NOT IN
具有並且通常得到the most efficient plan。
SELECT KundeID,
Kundenummer,
Fornavn,
Efternavn,
Adresse,
Postnummer,
[By]
FROM dbo.Kundeliste
WHERE NOT EXISTS (SELECT *
FROM Ordreliste
WHERE Ordreliste.KundeID = Kundeliste.KundeID)
您當前的查詢與<>
條件會執行幾乎整個笛卡爾/交叉連接。對於dbo.Kundeliste
中的每一行,它將加入Ordreliste
中的所有行,但以外的行具有相同的KundeID
或KundeID
爲空。
另外:http://dba.stackexchange.com/a/4010/630 – gbn 2011-12-17 14:54:26
Thx一百萬! :) – 2011-12-17 14:59:52
嘗試類似於:'SELECT ... from dbo.Kundeliste其中沒有KundeID在(選擇KundeID來自Ordreliste)' – user685684 2011-12-17 14:08:12
那麼,INNER JOIN只返回**已經下了訂單的那些 - 這是主要問題在您的查詢。看到馬丁的優秀答案 - 這就是要走的路 – 2011-12-17 14:09:23