2016-08-04 3 views
-1

У меня есть 1000 строк, в которых я хочу, чтобы проверить, если эти записи выходят в таблице следующим образомSQL Server: фильтрация, хотя большой набор данных

select * 
from table 
where ID in ('TS145698', 'TF58964', 'TG47896', 'TS12369') 

Если я вхожу 1000 идентификаторы, я получить данные для 786, как узнать, какой из 214 ID не находится в таблице?

+2

Поместите эти 1000 ID в таблицу темп. НЕ СУЩЕСТВУЕТ. – jarlh

+0

И если вам неинтересно NULL на идентификаторе, то НЕ ВХОД. – DVT

ответ

1

Вы можете использовать таблицу шаблонов.

DECLARE @Template TABLE (ID NVARCHAR(50)) 

INSERT INTO @Template 
VALUES 
('TS145698'), 
('TF58964'), 
('TG47896'), 
('TS12369') 

SELECT * 
FROM 
    @Template A LEFT JOIN 
    table B ON A.ID = B.ID 
WHERE 
    B.ID IS NULL 
+0

Если бы мне пришлось отфильтровать это в excel вместо создания temp_table? – doe

+0

@doe Извините, что вы имеете в виду? – NEER

+0

Им просто думать было бы легче, если я возьму записи, которые у меня есть, и попытаться сопоставить их в excel? – doe

0

ли вы имеете в виду, что:

select * from table where ID not in 
      ('TS145698' 
      ,'TF58964' 
      ,'TG47896' 
      ,'TS12369' 
      ) 
+0

Я пробовал это, но он просто продолжает выполнять и возвращает мне несколько данных, что больше, чем 214 записей, это возвращает мне, как 20 000 строк – doe

+0

@ doe - поэтому ваш стол должен иметь более 1000 записей. Вы говорите, что у вас есть 1000 записей, и вы хотите знать, какие из них не указаны в списке идентификаторов? В этом случае вам нужно выбрать 1000, затем ... И где ID не в ... и т. Д. – Cato

+0

Сначала я хотел проверить, какие идентификаторы находятся в таблице, а в разделе «i» теперь я знаю, какие они есть, теперь я не знаю, какие из них не входят в список из 1000 идентификаторов, которые я фильтрую для – doe

1

Вы можете создать таблицу значений критериев, а затем сделать левый присоединиться к главной таблице:

SELECT A.*, B.* 
FROM [YourCriteriasTable] AS A 
LEFT JOIN [table] AS B ON A.ID = B.ID 

и ваш разыскиваемого ID-х будет иметь нулевые значения в поле B. *.

1

Один из способов сделать это - ввести эти значения в параметр таблицы, cte или временную таблицу, а затем использовать левое соединение с фактической таблицей. Другой способ заключается в использовании пункт значения:

Создание и заполнение таблицы выборки (Пожалуйста сохранить нас этот шаг в ваших будущих вопросов)

DECLARE @T as TABLE 
(
    Id int 
) 

INSERT INTO @T VALUES (1), (2), (3), (4) 

запрос:

SELECT v.Id 
FROM (VALUES (1), (2), (3), (5), (6)) AS v(Id) -- Use this instead of the IN operator 
LEFT JOIN @T T ON v.Id = T.Id 
WHERE T.Id IS NULL 

Результаты :

Id 
----------- 
5 
6 

Другой вариант - использовать UNION, чтобы создать список значений:

SELECT v.Id 
FROM (
    SELECT 1 As Id 
    UNION 
    SELECT 2 
    UNION 
    SELECT 3 
    UNION 
    SELECT 4 
    UNION 
    SELECT 5 
    UNION 
    SELECT 6 
) AS v -- Use this instead of the IN operator 

LEFT JOIN @T T ON v.Id = T.Id 
WHERE T.Id IS NULL 
+0

У меня есть 1000 идентификаторов для фильтрации – doe

+0

1000 или 5 не имеет значения. Вы должны использовать эти значения в качестве источника данных, поэтому используйте либо временную таблицу, и переменную таблицы, и значение value, либо таблицу cte, либо производную таблицу. Я бы включил версию переменной таблицы, но Neer был быстрее меня. –

Смежные вопросы