Справка по SQL: поиск строк в одной таблице, которых нет во второй таблице, на основе значений в двух столбцах - PullRequest
4 голосов
/ 22 января 2010

У меня есть две таблицы. Я пытаюсь найти строки в одной таблице, которые не существуют во второй таблице на основе значений в двух столбцах. (Я упростил таблицы, включив только два столбца). Между двумя таблицами нет первичных / внешних ключей. Кажется достаточно простым, но у меня сейчас мозговой блок!

DDL:
CREATE TABLE [dbo].[Table_1](
    [firstname] [nchar](10) NULL,
    [lastname] [nchar](10) NULL
) 

CREATE TABLE [dbo].[Table_2](
    [firstname] [nchar](10) NULL,
    [lastname] [nchar](10) NULL
) 

- создать пример данных

INSERT INTO [dbo].[Table_1]([firstname], [lastname])
SELECT N'John      ', N'Doe       ' UNION ALL
SELECT N'John      ', N'Smith     '
INSERT INTO [dbo].[Table_2]([firstname], [lastname])
SELECT N'John      ', N'Doe       '

- Мои неудачные попытки. Я ожидаю, что Джон Смит вернется

SELECT t.* FROM Table_1 AS t
WHERE NOT EXISTS
(SELECT t2.* FROM Table_2 AS t2
WHERE t.firstname <> t2.firstname
AND t.lastname <> t2.lastname)

SELECT * FROM Table_1 AS t
JOIN Table_2 AS t2
ON t.firstname <> t2.firstname
AND t.lastname <> t2.lastname

Ответы [ 4 ]

9 голосов
/ 22 января 2010

Как насчет этого:

SELECT * 
FROM Table_1 AS t1
LEFT OUTER JOIN Table_2 AS t2
ON t1.firstname = t2.firstname
AND t1.lastname = t2.lastname
WHERE t2.firstname IS NULL AND t2.lastname IS NULL

В моем случае я вернул только Джона Смита.

В основном вы выполняете внешнее соединение между таблицами в общих полях - те строки, которые присутствуют в обоих случаях, будут иметь значения как t1, так и t2.

Эти строки, присутствующие только в t1, не будут иметь значений для второй таблицы t2.

2 голосов
/ 22 января 2010

Я думаю, что это должно работать:

SELECT t.* FROM Table_1 AS t
 LEFT JOIN Table_2 t2 ON (t.firstname = t2.firstname AND t.lastname = t2.lastname)
WHERE t2.firstname IS NULL AND t2.lastname IS NULL

Но я удивлен, что ваша первая попытка не сработала:

SELECT t.* FROM Table_1 AS t
WHERE NOT EXISTS
(SELECT t2.* FROM Table_2 AS t2
WHERE t.firstname <> t2.firstname
AND t.lastname <> t2.lastname)
0 голосов
/ 09 января 2014

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

SELECT * 
FROM Table_1 AS t1
WHERE NOT EXISTS
    (
        SELECT *
        FROM Table_2 AS t2
        WHERE t1.firstname = t2.firstname
            AND t1.lastname = t2.lastname
    )
0 голосов
/ 22 января 2010

Вы можете попробовать левое внешнее соединение, используя оба столбца в предложении ON.

Затем используйте предложение WHERE, чтобы отфильтровать что-либо, где обе таблицы совпадают

SELECT * FROM table_1 AS one
LEFT OUTER JOIN table_2 AS two
ON one.firstname = two.firstname
AND one.lastname = two.lastname
WHERE two.firstname IS NULL AND two.lastname IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...