Как я могу объединить две таблицы, но вернуть только те строки, которые не совпадают? - PullRequest
22 голосов
/ 07 июля 2011

У меня есть две таблицы, которые выглядят так:

T1:  ID  |  Date  |  Hour  | Interval
T2:  ID  |  Date  |  Hour

Мне нужно присоединиться к этим таблицам, когда их идентификаторы, даты и часы совпадают. Однако я хочу вернуть только результаты из таблицы 1, которые не совпадают с результатами в таблице 2.

Я знаю, что это кажется простым, но я застрял в том факте, что в таблице 1 есть несколько строк, которые соответствуют таблице 2 (есть несколько интервалов для любого данного часа). Мне нужно вернуть все эти интервалы, если они не попадают в один и тот же часовой период в таблице 2.

Пример данных:

T1:  1  |  1/1/2011  |  1  |  1
     1  |  1/1/2011  |  1  |  2
     1  |  1/1/2011  |  2  |  1
     1  |  1/1/2011  |  2  |  2

T2:  1  |  1/1/2011  |  1

Мой ожидаемый набор результатов для этого будет последние две строки из T1. Кто-нибудь может указать мне правильный путь?

Ответы [ 2 ]

55 голосов
/ 07 июля 2011
SELECT T1.*
    FROM T1
    WHERE NOT EXISTS(SELECT NULL
                         FROM T2
                         WHERE T1.ID = T2.ID 
                             AND T1.Date = T2.Date
                             AND T1.Hour = T2.Hour)

Это также можно сделать с помощью LEFT JOIN:

SELECT T1.*
    FROM T1
        LEFT JOIN T2
            ON T1.ID = T2.ID
                AND T1.Date = T2.Date
                AND T1.Hour = T2.Hour
    WHERE T2.ID IS NULL
24 голосов
/ 07 июля 2011

Используйте LEFT JOIN и отфильтруйте строки, у которых есть не NULL T2 столбцы:

SELECT T1.* FROM T1 LEFT JOIN T2 ON T1.ID = T2.ID
    AND T1.Date = T2.Date AND T1.Hour = T2.Hour
    WHERE T2.ID IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...