テーブルの行と一致しない値の特定


10

クエリで指定された一意の識別子のうち、テーブルに存在しない一意の識別子を簡単に確認できるようにしたいと思います。

よりよく説明するために、リスト「1、2、3、4」のどのIDがテーブルに存在しないかを確認するために、私が今行うことは次のとおりです。

  1. SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4')、テーブルにID 2の行が含まれていないとしましょう。
  2. 結果をExcelにダンプする
  3. 結果リストの各リスト値を検索する元のリストでVLOOKUPを実行します。
  4. 結果となるVLOOKUP #N/Aは、テーブルで発生しなかった値になります。

これを行うにはもっと良い方法があるはずだと思います。私は理想的には次のようなものを探しています

チェックするリスト->チェックするテーブルにクエリ->テーブルにないリストのメンバー


SQL Serverのバージョンを推測させないでください。
アーロンバートランド


謝罪。[編集]古いです。NOT INの問題は、テーブル内の他のすべてを返すことです...
NReilingh

回答:


14

使用EXCEPT

SELECT * FROM
  (values (1),(2),(3),(4)) as T(ID)
EXCEPT
SELECT ID 
FROM [TABLE];

SqlFiddleを参照してください。


valuesコンストラクタは、SQL Server 2008またはそれ以降の上で動作します。2005年には、

SELECT 'value'
UNION SELECT 'value'

このSOの答えで詳述されているように


おっと、指定する必要があります。IDがvarcharの場合はどうなりますか?
NReilingh 2013年

1
@NReilinghはDBを再設計します:)しかし、それは私が思うに同じように動作するはずです
JNK

私はIncorrect syntax near the keyword 'values'.走り続けているSELECT * FROM (values ('search string'),('other string')) as T(ID)
NReilingh

SQL Server 2008r2では構文が適切に機能します-あなたのコメントを貼り付けて実行しました。
JNK、2013年

私は2005年です。キリスト。
NReilingh 2013年

6

検索しているIDを含むテーブル変数または一時テーブルを作成します。次に、2008の構文糖を除いたRemusのソリューションを使用します。

declare @t table (ID int)
insert into @t values (1)
insert into @t values (2)
insert into @t values (3)
insert into @t values (4)
insert into @t values (5)

select ID from @t
except
select ID
from [Table];

3

私はこの質問をしたときよりも2年賢く(そしてより新しいSQL Serverを使用している)ので、これを尋ねるために得た有名な質問バッジを祝うために、ここで私は何をしますか。(それEXCEPT以来、この演算子を使用したことはないと思います。)

LEFT JOIN以下の方法はEXCEPT、CTEを必要とせずに他の結合で構成できるためよりも便利だと思います。

SELECT v.val
  FROM (VALUES (1), (2), (3), (4), (5)) v (val)
    LEFT JOIN dbo.SomeTable t
      ON t.id = v.val
  WHERE t.id IS NULL;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.