トップ回答者
2つのテーブルを比較し、異なるレコードを抽出したい

質問
-
どなたかご教示いただけますでしょうか。よろしくお願いいたします。
SQL Server に以下のようなテーブル定義が同じで、異なる名称のテーブルがございます。
[ID] [nchar](5) NOT NULL,
[flg] [tinyint] NULL,
[namae] [nvarchar](50) NULLテーブルA
ID | flg | namae
-----------------
101|NULL | 田中
102|1 | 鈴木
103|0 | 近藤
200|1 | 高田テーブルB
ID | flg | namae
-----------------
101|NULL | 田中太郎 <--- 抽出したい (名前が追加されたため)
102|2 | 鈴木 <--- 抽出したい (flg が変更されたため)
103|0 | 近藤
105|0 | 佐藤(ご質問)
両テーブルに同じ ID のレコードが存在するレコードが対象で、かつ ID 以外のフィールド値でどれか一つでも異なる B テーブルのデータを抽出するクエリーはございますでしょうか。
もしご存じの方がいらしましたら、ご教示いただけないでしょうか。よろしくお願いいたします。
※プログラムを作って実行すると抽出完了まで時間を要すため、クエリーでできないものか試行錯誤しましたがどうしてもできず、質問させていただいた次第です。
回答
-
細かいですがSQLでの否定は ! でなく NOT です。加えて NOT (expr IS NULL) は expr IS NOT NULL と書けます。以上を踏まえて
SELECT B.ID, B.flg, B.namae FROM B INNER JOIN A ON B.ID = A.ID WHERE B.flg <> A.flg OR B.flg IS NULL AND A.flg IS NOT NULL OR B.flg IS NOT NULL AND A.flg IS NULL OR B.namae <> A.namae OR B.namae IS NULL AND A.namae IS NOT NULL OR B.namae IS NOT NULL AND A.namae IS NULL;
かな?
# ISNULL(B.flg <> A.flg, B.flg IS NOT NULL OR A.flg IS NOT NULL) とはできないのね…。
- 回答としてマーク yumi08 2016年1月16日 1:24
すべての返信
-
FROM TableA A INNER JOIN TableB on a.id = b.id して、できた列を1こずつ a.flg <> b.flg AND a.namae <> b.namae ...みたいな条件を並び立てるしかないと思いますが。
あ、NULLが含まれる列は比較文を書くのが超面倒くさくなるので、そのつもりで。
flg項目1つなら、「(a.flg IS NULL AND ! (b.flg IS NULL)) OR (!(a.flg IS NULL) AND b.flg IS NULL) OR a.flg <> b.flg、」かなjzkey
-
以下のスレッドで私が書いたSQLが参考になるのではないかと思います。
データのバックアップの方法について教えてください。
https://social.msdn.microsoft.com/Forums/sqlserver/ja-JP/528cc3c4-c735-4ad0-8e3c-df1b040fd44d?forum=sqlserverja★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
-
細かいですがSQLでの否定は ! でなく NOT です。加えて NOT (expr IS NULL) は expr IS NOT NULL と書けます。以上を踏まえて
SELECT B.ID, B.flg, B.namae FROM B INNER JOIN A ON B.ID = A.ID WHERE B.flg <> A.flg OR B.flg IS NULL AND A.flg IS NOT NULL OR B.flg IS NOT NULL AND A.flg IS NULL OR B.namae <> A.namae OR B.namae IS NULL AND A.namae IS NOT NULL OR B.namae IS NOT NULL AND A.namae IS NULL;
かな?
# ISNULL(B.flg <> A.flg, B.flg IS NOT NULL OR A.flg IS NOT NULL) とはできないのね…。
- 回答としてマーク yumi08 2016年1月16日 1:24
-