SQL Server - НЕ ВХОДИТ - PullRequest
       16

SQL Server - НЕ ВХОДИТ

27 голосов
/ 21 апреля 2011

Мне нужно создать запрос, который покажет мне записи, которые находятся в Таблице 1, но не в Таблице 2, на основе комбинации make-model-serial number.

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

SELECT  *  
FROM Table1 WHERE MAKE+MODEL+[Serial Number] NOT IN
(SELECT make+model+[serial number] FROM Table2)

Таблица 1 имеет 5 записей.

Когда я меняю запрос на IN, я получаю 1 запись. Что я делаю не так с NOT?

Ответы [ 6 ]

40 голосов
/ 21 апреля 2011

Это из-за работает метод 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]);
6 голосов
/ 21 апреля 2011

Вам, вероятно, лучше сравнивать поля по отдельности, чем объединять строки.

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
1 голос
/ 23 января 2013
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] было одно имя поля

1 голос
/ 21 апреля 2011
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])
);
0 голосов
/ 21 апреля 2011

Одной из проблем может быть то, что если либо make, то модель, либо [серийный номер] будут нулевыми, значения никогда не будут возвращены.Поскольку конкатенация строк со значениями NULL всегда приводит к NULL, а не в () с NULL всегда ничего не возвращает.Для этого необходимо использовать оператор IsNull (make, '') + IsNull (Model, '') и т. Д.

0 голосов
/ 21 апреля 2011

Используйте левое соединение, проверяя правую сторону на наличие нулей.

SELECT a.Id
FROM TableA a
LEFT JOIN TableB on a.Id = b.Id
WHERE b.Id IS NULL

Вышеприведенное совпадет с таблицами TableA и TableB на основе столбца Id в каждом, а затем даст вам строки, в которых сторона B пуста.

...