2011-12-17 217 views
2
SELECT KundeID, Kundenummer, Fornavn, Efternavn, Adresse, Postnummer, [By] 
FROM dbo.Kundeliste 
INNER JOIN Ordreliste 
ON Ordreliste.KundeID<>Kundeliste.KundeID 

我沒有得到正確的輸出。我需要所有尚未從我的客戶列表中下訂單的客戶這有什麼問題?

+0

嘗試類似於:'SELECT ... from dbo.Kundeliste其中沒有KundeID在(選擇KundeID來自Ordreliste)' – user685684 2011-12-17 14:08:12

+1

那麼,INNER JOIN只返回**已經下了訂單的那些 - 這是主要問題在您的查詢。看到馬丁的優秀答案 - 這就是要走的路 – 2011-12-17 14:09:23

回答

6

您需要一個anti semi join。執行此操作的三種最常見的方法是在NULL上過濾NOT EXISTS,NOT INOUTER 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中的所有行,但以外的行具有相同的KundeIDKundeID爲空。

+0

另外:http://dba.stackexchange.com/a/4010/630 – gbn 2011-12-17 14:54:26

+1

Thx一百萬! :) – 2011-12-17 14:59:52