25

1000 を超えるテーブル (顧客など) を持つテーブルがあります。

既知の顧客リストの詳細を必要とするクエリがあります (例: CustomerID - 1,79,14,100,123)

IN() 関数は、クエリに使用したいものです。

リストに一致する顧客を見つけることがわかっている場合、次のように記述します。

SELECT * FROM Customers
WHERE CustomerID IN (1,79,14,100,123)

リストにないものを見つけるには、次のように書きます

SELECT * FROM Customers
WHERE CustomerID NOT IN (1,79,14,100,123)

質問

返されなかった、またはリストから一致が見つからなかった顧客のリストを見つけるにはどうすればよいですか?

Customers テーブルに (1,79,100) しかないとします。この場合、14 と 123 は一致しません。一致しない値を見つける方法を教えてください。

私の例では単純化していました。私のアイテム リストには 300 を超える ID があるためWHERE、長いリストで条件を使用するのORは面倒です。self LEFT JOIN と組み合わせて、14 と 123 になる NULL ペアの値を特定することを考えました。

よりエレガントなアプローチはありますか?

4

3 に答える 3

25

たとえば、派生テーブルまたは一時テーブルを使用して のリストを保持し、 でCustomerId一致しないものを見つけることができますEXCEPT

以下は、テーブル値コンストラクターを派生テーブルとして使用します (SQL Server 2008+ と互換性があります)。

SELECT CustomerId
FROM   (VALUES(1),
              (79),
              (14),
              (100),
              (123)) V(CustomerId)
EXCEPT
SELECT CustomerId
FROM   Customers 
于 2013-06-20T09:04:20.833 に答える
1

何も問題はありませんLEFT JOINが、使用することもできますnot exists

SELECT * 
FROM Customers c
WHERE not exists (select * from CustomerDetails ds where ds.CustomerId = c.CustomerId)
于 2013-06-20T09:06:09.527 に答える