Подтвердить что ты не робот

ВЫБРАТЬ те, которые не найдены в списке IN()

Извиняюсь, если уже есть ответ на этот вопрос, я искал и, вероятно, не мог придумать правильные ключевые слова, чтобы найти его.

У меня есть таблица с более чем 1000 таблиц (например, клиенты).

У меня есть запрос, требующий сведения об известном списке клиентов (например, по CustomerID - 1,79,14,100,123)

Функция IN() - это то, что я хотел бы использовать для запроса.

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

SELECT * FROM Customers WHERE CustomerID IN (1,79,14,100,123)

Чтобы найти те, которых нет в списке, я бы написал

SELECT * FROM Customers WHERE CustomerID NOT IN (1,79,14,100,123)

Вопрос

Как найти список клиентов, которые НЕ вернулись или не нашли совпадений в списке.

Предположим, что таблица "Клиенты" имеет только (1,79,100). Тогда это будет означать, что 14 и 123 не будут сопоставлены. Как мне найти те значения, которые не находят соответствия.

Я был упрощен в моем примере. Мой список предметов имеет более 300 идентификаторов, поэтому использование условия WHERE с длинным списком OR было бы громоздким/неуклюжим. Я подумал о том, чтобы объединиться с self LEFT JOIN и определить парные значения NULL, которые будут 14 и 123

Есть ли более элегантный подход?

4b9b3361

Ответ 1

Вы можете использовать производную таблицу или временную таблицу, например, для хранения списка CustomerId, затем найдите несоответствующие с EXCEPT.

Ниже используется конструктор табличных значений в виде производной таблицы (совместимой с SQL Server 2008 +)

SELECT CustomerId
FROM   (VALUES(1),
              (79),
              (14),
              (100),
              (123)) V(CustomerId)
EXCEPT
SELECT CustomerId
FROM   Customers 

Ответ 2

В LEFT JOIN нет ничего плохого, но вы также можете использовать not exists

SELECT * 
FROM Customers c
WHERE not exists (select * from CustomerDetails ds where ds.CustomerId = c.CustomerId)