私は2つのテーブルを持っています:
表 A
ID Name
1 abc
2 xyz
表 B
ID Name
1 abc
2 xyz
3 mno
2 つのテーブルの上に個別の値のフォームが必要です。つまり、テーブル B の ID 3 Name mno のみが必要です (2 つのテーブルから一意であるため)。
この値を取得する方法を教えてください。
ありがとう、アジェイ
私は2つのテーブルを持っています:
表 A
ID Name
1 abc
2 xyz
表 B
ID Name
1 abc
2 xyz
3 mno
2 つのテーブルの上に個別の値のフォームが必要です。つまり、テーブル B の ID 3 Name mno のみが必要です (2 つのテーブルから一意であるため)。
この値を取得する方法を教えてください。
ありがとう、アジェイ
Bこのクエリは、 に存在しない行を取得しますA。
SELECT b.* FROM TableB b
OUTER JOIN TableA a ON a.ID = b.ID AND a.Name = b.Name
WHERE a.ID IS NULL
次に、反対のことを行い、 a を使用しUNION ALLて両方の方法で取得できます。
SELECT a.* FROM TableA a
OUTER JOIN TableB b ON b.ID = a.ID AND b.Name = a.Name
WHERE b.ID IS NULL
UNION ALL
SELECT b.* FROM TableB b
OUTER JOIN TableA a ON a.ID = b.ID AND a.Name = b.Name
WHERE a.ID IS NULL
それを達成する別の方法は次のとおりです。
;WITH MatchingRows AS (
SELECT a.ID FROM TableA a
JOIN TableB b ON b.ID = a.ID AND b.Name = a.Name
)
SELECT * FROM TableA
WHERE ID NOT IN (SELECT m.ID FROM MatchingRows m)
UNION ALL
SELECT * FROM TableB
WHERE ID NOT IN (SELECT m.ID FROM MatchingRows m)
それがより良いパフォーマンスを発揮するかどうかはわかりません-それは私が考えたものです. 私が間違っていなければ、これは実際にはWITHクエリを 2 回実行します (この質問への回答を参照してください)。これは、2 回使用されているためです。したがって、このアプローチにはパフォーマンスへの影響がある可能性があります。
EXCEPT 演算子が役立つ場合があります。これは、データを使用した例です。
CREATE TABLE TableA (id int, name varchar(50))
INSERT INTO TableA VALUES (1, 'abc'),(2,'xyz')
CREATE TABLE TableB (id int, name varchar(50))
INSERT INTO TableB VALUES (1, 'abc'),(2,'xyz'),(3,'mno')
SELECT * FROM TableB
EXCEPT
SELECT * FROM TableA
UNION のように動作しますが、注意してください。すべての列が完全に一致する行のみを除外します。