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

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?

4b9b3361

Ответ 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, '') и т.д.