Определение того, какие значения НЕ соответствуют строке таблицы

10

Я хотел бы иметь возможность легко проверить, какие уникальные идентификаторы не существуют в таблице, из тех, которые указаны в запросе.

Чтобы лучше объяснить, вот что я хотел бы сделать сейчас, чтобы проверить, какие идентификаторы списка «1, 2, 3, 4» не существуют в таблице:

  1. SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4')Допустим, таблица не содержит строки с идентификатором 2.
  2. Сбросить результаты в Excel
  3. Запустите VLOOKUP для исходного списка, который ищет каждое значение списка в списке результатов.
  4. Любой VLOOKUP, который приводит к, #N/Aнаходится на значении, которое не встречается в таблице.

Я думаю, что должен быть лучший способ сделать это. Я ищу, в идеале, что-то вроде

Список для проверки -> Запрос к таблице для проверки -> Члены списка не в таблице

NReilingh
источник
Пожалуйста, не заставляйте нас угадывать версию SQL Server?
Аарон Бертран
НЕ В / СУЩЕСТВУЕТ? stackoverflow.com/questions/173041/not-in-vs-not-exists
Эрик Хиггинс,
Извиняюсь. [отредактировано] Это старое. Проблема с 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'

как подробно описано в этом так ответе .

Ремус Русану
источник
Упс, должен был указать. Что если ID - это varchar?
NReilingh
1
@NReilingh тогда перепроектируй свою БД :) но она должна работать так же, я думаю
JNK
Я продолжаю получать, Incorrect syntax near the keyword 'values'.когда бегуSELECT * FROM (values ('search string'),('other string')) as T(ID)
NReilingh
Ваш синтаксис отлично работает для меня в SQL Server 2008r2 - я вставил ваш комментарий и он запустился.
JNK
Я в 2005 году. Христос.
НРейлинг
6

Я хотел бы создать переменную таблицы или временную таблицу, содержащую идентификаторы, которые вы ищете ... затем использовать решение Ремуса, за исключением синтаксического сахара 2008 года:

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

Теперь я на пару лет мудрее (и имею более новый 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;
NReilingh
источник