Фильтровать имена, которые не были найдены в запросе SQL select

#sql #tsql

#sql #tsql

Вопрос:

Чтобы упростить мою проблему, у меня есть список имен:

(‘Джон’, ‘Джо’, ‘Джейн’, ‘Дэйв’..)

и таблица, заполненная следующими столбцами

Имя Возраст Адрес

Я использую следующий запрос для выбора имен, которые существуют в списке:

 SELECT Name,Age,Address from Table1 where Name in ('Jon','Joe','Jane'...)
  

но я хочу найти в списке имена, которых нет в таблице, как мне это сделать?

Комментарии:

1. Как хранится список имен (в другой таблице). Кроме того, насколько велика основная таблица? Существуют некоторые методы обработки строк, но они будут работать не очень хорошо. Вы также можете поместить имена во временную таблицу и использовать NOT in или проверку LEFT JOIN и Null

2. на какой версии sql server вы работаете, 2014, 2016, 2017?

3. @Sparky поднимает несколько допустимых вопросов. В принципе, нам нужен способ преобразования списка в таблицу, чтобы вы могли присоединяться слева или нет к вашей основной «Table1» и возвращать обратно эти имена в списке, а не в таблице. Итак, является ли список строкой, которую вы откуда-то получили, и это формат, или эти имена, возможно, хранятся в другой таблице?

4. Просто для ясности, если 'Jon' и 'Jane' встречаются в Name столбце Table1 , но 'Joe' разве вы не хотите, чтобы результат был 'Joe' , верно? (Не имеет в виду пренебрежение 'Dave' и остальной частью диапазона.)

5. Да, @HABO . И я сохраню имена, которые не были найдены (например, ‘Joe’), в текстовом файле

Ответ №1:

Вы ищете left join или что-то подобное:

 select v.name
from (values ('Jon'), ('Joe'), ('Jane'), . . . 
     ) v(name)
where not exists (select 1 from table1 t1 where t1.name = v.name);
  

Ответ №2:

Это можно использовать для поиска записей, у которых нет NULL в столбце name

 SELECT Name,Age,Address from Table1 where Name NOT in ('Jon','Joe','Jane'...) 
  

Это можно использовать для поиска записей, в столбце name которых присутствует значение NULL

 SELECT Name,Age,Address from Table1 where Name NOT in ('Jon','Joe','Jane'...) OR Name IS NULL
  

Комментарии:

1. Хотя это решение будет работать, оно жестко кодирует список имен, что, я думаю, не является желательным.

2. Они найдут имена в таблице, которых нет в списке, но оператору нужны имена в списке , которых нет в таблице .