2017-11-29 28 views
1

の比較に基づいて、表2に含まれていないTABLE1内の行を見つけます。私は両方のテーブルの2つの列を比較して、最初の行にある行を検索しますが、もう一方の行は検索しません。今のところ私はLEFT JOINを2つの列に使用しています。私は、ジャンクデータを一時テーブルとメソッドの作品が、私はそれが実際に動作するかどうかを検証することはできませんので、私の本番データ・セットは、行をたくさん持っている上でテスト。私は3列を持つ2つのテーブルを持つ2つの列

CREATE TABLE table1(
    [Timestamp] [date], 
    [name] [varchar](50) NULL, 
    [value] [varchar](50) NULL 
) 

CREATE TABLE table2(
    [Timestamp] [date], 
    [name] [varchar](50) NULL, 
    [value] [varchar](50) NULL 
) 

INSERT INTO table1 VALUES ('2017-09-10', 'a', 'one'), 
('2017-01-19', 'a', 'two'), 
('2016-12-07', 'a', 'three'), 
('2016-11-15', 'b', 'four'), 
('2016-10-19', 'b', 'five'), 
('2017-07-09', 'b', 'six'), 
('2016-01-31', 'c', 'seven'), 
('2016-12-15', 'd', 'eight'); 

INSERT INTO table2 VALUES ('2016-12-15', 'a', 'two'), 
('2016-06-20', 'b', 'four'), 
('2017-04-09', 'b', 'five'), 
('2016-03-03', 'b', 'six'), 
('2016-03-24', 'c', 'seven'), 
('2016-07-04', 'e', 'nine'), 
('2016-10-24', 'f', 'ten'), 
('2016-11-06', 'g', 'eleven') 

SELECT * FROM table1 

    | Timestamp | name | value | 
    |------------|------|-------| 
    | 2017-09-10 | a | one | 
    | 2017-01-19 | a | two | 
    | 2016-12-07 | a | three | 
    | 2016-11-15 | b | four | 
    | 2016-10-19 | b | five | 
    | 2017-07-09 | b | six | 
    | 2016-01-31 | c | seven | 
    | 2016-12-15 | d | eight | 

SELECT * FROM table2 

    | Timestamp | name | value | 
    |------------|------|--------| 
    | 2016-12-15 | a | two | 
    | 2016-06-20 | b | four | 
    | 2017-04-09 | b | five | 
    | 2016-03-03 | b | six | 
    | 2016-03-24 | c | seven | 
    | 2016-07-04 | e | nine | 
    | 2016-10-24 | f | ten | 
    | 2016-11-06 | g | eleven | 

SELECT table1.name, table1.value, IIF(table2.Timestamp IS NULL, 'missing', 'not missing') AS 'status' FROM table1 LEFT JOIN table2 ON table1.name = table2.name AND table1.value = table2.value 

    | name | value | status  | 
    |------|-------|-------------| 
    | a | one | missing  | 
    | a | two | not missing | 
    | a | three | missing  | 
    | b | four | not missing | 
    | b | five | not missing | 
    | b | six | not missing | 
    | c | seven | not missing | 
    | d | eight | missing  | 

DROP TABLE table1 
DROP TABLE table2 
+1

私には罰金です。私は予約語を使うのは良い方法ではないので、あなたの実際のテーブルでは、より良いカラム名を持つことを願っています。 –

+1

名前と値の両方がNULLを許可します。あなたのサンプルデータにはnullがありません。それらをテストしましたか?あなたのコードはあなたが望むことをしますか? –

+0

は私の実際のデータでは、null'なので 'ことはできませんも任意の' null'sがあるでしょう。私はちょうど質問のために一緒に迅速に一緒に投げた。このコードは小さなテストテーブルで動作しますが、私の大きな生産テーブルで動作することを確認する信頼できる方法はありません。だから私はここで検証を受けるように求めていた。 – IMTheNachoMan

答えて

1

あなたは正しい方向にあります。一致するものがないかどうかを判断するには、右側の値がnullであるかどうかをテストするだけでした。最高のパフォーマンスを得るために、あなたは、両方のテーブルの名前&値のインデックスをお勧めします。

SELECT table1.name, 
     table1.value 
    FROM table1 
    LEFT OUTER JOIN table2 
    ON table1.name = table2.name 
    AND table1.value = table2.value 
    WHERE table2.value IS NULL 
+0

ありがとう!だから私はすべての行を見て、一致するかどうかを示したい場合、私はそれを持っている方法はまだ動作します。 – IMTheNachoMan