web-dev-qa-db-ja.com

2つのテーブルを結合し、一致しない行のみを返すにはどうすればよいですか?

次のような2つのテーブルがあります。

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

ID、日付、および時間が一致する場合、基本的にこれらのテーブルを結合する必要があります。ただし、表1からnotが表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行です。誰かが私を正しい方向に向けることができますか?

22
Breakthrough
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
55
Joe Stefanelli

使う 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
24
Costi Ciudatu