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が必要です。これを行うための最も一般的な3つの方法は、NULL
でフィルタリングするNOT EXISTS
,NOT IN
、およびOUTER JOIN
です。
それはNOT IN
があり、一般的にthe most efficient planを取得することをNULL
sの問題を避けるように私は、一般的にNOT EXISTS
を使用しています。
SELECT KundeID,
Kundenummer,
Fornavn,
Efternavn,
Adresse,
Postnummer,
[By]
FROM dbo.Kundeliste
WHERE NOT EXISTS (SELECT *
FROM Ordreliste
WHERE Ordreliste.KundeID = Kundeliste.KundeID)
<>
条件の現在のクエリは、ほぼ完全なデカルト/クロス結合を実行します。 dbo.Kundeliste
の各行については、同じKundeID
またはKundeID
がnullであるものを除いて、Ordreliste
の行すべてに参加します(を除く)。
また:http://dba.stackexchange.com/a/4010/630 – gbn
Thx百万! :) –
「SELECT ... from dbo.Kundeliste KundeID in(OrdrelisteからKundeIDを選択してください)」 – user685684
まあ、INNER JOINは**既に**注文しているものを返すだけです - それがメインですあなたの質問に問題があります。マーティンの優れた答えを参照してください - それは行く方法です –