ВЫБРАТЬ те, которые не найдены в списке 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
Есть ли более элегантный подход?
Ответы
Ответ 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)