Визначення, які значення НЕ відповідають таблиці таблиці


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має значення, яке не було в таблиці.

Я думаю, що має бути кращий спосіб зробити це. Я в ідеалі шукаю щось подібне

Список для перевірки -> Запит на таблиці, щоб перевірити -> Члени списку, які не знаходяться в таблиці


Будь ласка, не змушуйте нас здогадуватися про версію 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'

як детально в цій відповіді ТА .


Ну, слід було вказати. Що робити, якщо ідентифікатор - варчар?
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. Христе.
NReilingh

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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.