SQL Server - НЕ ВХОД
Мне нужно создать запрос, который покажет мне записи, которые приведены в таблице 1, но они не указаны в таблице 2 на основе комбинации серийных номеров модели.
Я знаю, что есть 4 записи, которые отличаются друг от друга, но мой запрос всегда возвращается.
SELECT *
FROM Table1 WHERE MAKE+MODEL+[Serial Number] NOT IN
(SELECT make+model+[serial number] FROM Table2)
Таблица 1 содержит 5 записей.
Когда я меняю запрос на IN
, я получаю 1 запись. Что я делаю неправильно с NOT
?
Ответы
Ответ 1
Это из-за того, как работает NOT IN.
Чтобы избежать этих головных болей (и для более быстрого запроса во многих случаях), я всегда предпочитаю NOT EXISTS:
SELECT *
FROM Table1 t1
WHERE NOT EXISTS (
SELECT *
FROM Table2 t2
WHERE t1.MAKE = t2.MAKE
AND t1.MODEL = t2.MODEL
AND t1.[Serial Number] = t2.[serial number]);
Ответ 2
Вам, вероятно, лучше сравнивать поля отдельно, а не конкатенировать строки.
SELECT t1.*
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.MAKE = t2.MAKE
AND t1.MODEL = t2.MODEL
AND t1.[serial number] = t2.[serial number]
WHERE t2.MAKE IS NULL
Ответ 3
SELECT [T1].*
FROM [Table1] AS [T1]
WHERE NOT EXISTS (SELECT
1 AS [C1]
FROM [Table2] AS [T2]
WHERE ([T2].[MAKE] = [T1].[MAKE]) AND
([T2].[MODEL] = [T1].[MODEL]) AND
([T2].[Serial Number] = [T1].[Serial Number])
);
Ответ 4
SELECT * FROM Table1
WHERE MAKE+MODEL+[Serial Number] not in
(select make+model+[serial number] from Table2
WHERE make+model+[serial number] IS NOT NULL)
Это сработало для меня, где make+model+[serial number]
было одним именем поля
Ответ 5
Используйте LEFT JOIN, проверяя правильную сторону для нулей.
SELECT a.Id
FROM TableA a
LEFT JOIN TableB on a.Id = b.Id
WHERE b.Id IS NULL
Вышеупомянутые будут соответствовать таблицам A и TableB на основе столбца Id в каждом, а затем дать вам строки, где сторона B пуста.
Ответ 6
Одной из проблем может быть то, что если make, model или [serial number] были пустыми, значения никогда не будут возвращены. Поскольку конкатенации строк с нулевыми значениями всегда приводят к нулевому значению, а не в() с нулем, всегда будут возвращать ничего. Средством для этого является использование оператора, такого как IsNull (make, '') + IsNull (Model, '') и т.д.