web-dev-qa-db-ja.com

別のテーブルに存在しない値を選択します

私は2つのテーブルを持っています

表A:

ID
1
2
3
4

表B:

ID
1
2
3

次の2つのリクエストがあります。

  • テーブルBにはないテーブルAのすべての行(この場合は行4)を選択します。
  • テーブルBにないすべての行を削除したい。

SQL Server 2000を使用しています。

50
Wai Wong

NOT INを使用できます:

SELECT A.* FROM A WHERE ID NOT IN(SELECT ID FROM B)

ただし、その間はNOT EXISTSを好みます:

SELECT A.* FROM A WHERE NOT EXISTS(SELECT 1 FROM B WHERE B.ID=A.ID)

他のオプションもあります。この記事では、すべての利点と欠点を非常によく説明しています。

NOT IN、OUTER APPLY、LEFT OUTER JOIN、EXCEPT、またはNOT EXISTSを使用すべきですか?

86
Tim Schmelter

最初の質問には、少なくとも3つの一般的な方法から選択できます。

  • 存在しない
  • ありませんで
  • 左から参加

SQLは次のようになります。

SELECT * FROM TableA WHERE NOT EXISTS (
    SELECT NULL
    FROM TableB
    WHERE TableB.ID = TableA.ID
)

SELECT * FROM TableA WHERE ID NOT IN (
    SELECT ID FROM TableB
)

SELECT TableA.* FROM TableA 
LEFT JOIN TableB
ON TableA.ID = TableB.ID
WHERE TableB.ID IS NULL

使用しているデータベースに応じて、それぞれのパフォーマンスは異なります。 SQL Server (null許容列ではない)の場合:

NOT EXISTSおよびNOT IN述語は、問題の両方の列がNOT NULLである限り、欠損値を検索する最良の方法です。

26
Mark Byers

これはあなたの場合4を選択します

SELECT ID FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)

これはそれらを削除します

DELETE FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)
3
kamasheto
select ID from A where ID not in (select ID from B);

または

select ID from A except select ID from B;

2番目の質問:

delete from A where ID not in (select ID from B);
2
Behrang
SELECT ID 
  FROM A 
 WHERE NOT EXISTS( SELECT 1
                     FROM B
                    WHERE B.ID = A.ID
                 )
1
Mark Baker