1. ホーム
  2. sql

[解決済み] sql query to return differences between two tables

2022-04-18 08:43:41

質問

SQL Serverで2つのテーブルを比較し、あるデータを検証しようとしています。私は、データがどちらか一方にある両方のテーブルからすべての行を返したいのです。要するに、私はすべての不一致を表示したいのです。そのためには、FirstName、LastName、Productの3つのデータをチェックする必要があります。

私はSQLの初心者ですが、私が見つけた多くの解決策は、物事を複雑にしすぎているように思えます。私はNULLを心配する必要はありません。

まずはこんなことを試してみました。

SELECT DISTINCT [First Name], [Last Name], [Product Name] FROM [Temp Test Data]
WHERE ([First Name] NOT IN (SELECT [First Name] 
FROM [Real Data]))

しかし、これをさらに進めるのは難しいですね。

ありがとうございます。

EDIT

treaschf さんの回答を元に、以下のクエリのバリエーションで試しています。

SELECT td.[First Name], td.[Last Name], td.[Product Name]
FROM [Temp Test Data] td FULL OUTER JOIN [Data] AS d 
ON td.[First Name] = d.[First Name] AND td.[Last Name] = d.[Last Name] 
WHERE (d.[First Name] = NULL) AND (d.[Last Name] = NULL)

しかし、dにない行が少なくとも1つtdにあることが分かっているのに、0件の結果が返され続けています。

EDIT

OK、私はそれを理解したと思う。少なくとも、私の数分間のテストでは、十分に機能しているようです。

SELECT [First Name], [Last Name]
FROM [Temp Test Data] AS td
WHERE (NOT EXISTS
        (SELECT [First Name], [Last Name]
         FROM [Data] AS d
         WHERE ([First Name] = td.[First Name]) OR ([Last Name] = td.[Last Name])))

これは基本的に、私のテストデータの中にある ではない を、実際のデータで使用することができます。しかし、私が必要としているのは、この点です。

どのように解決するのですか?

テーブルがある場合 AB であり、ともにコルム C に存在するレコードは次のとおりです。 A には存在しないが B :

SELECT A.*
FROM A
    LEFT JOIN B ON (A.C = B.C)
WHERE B.C IS NULL

1つのクエリですべての差分を取得するには、次のように完全結合を使用する必要があります。

SELECT A.*, B.*
FROM A
    FULL JOIN B ON (A.C = B.C)
WHERE A.C IS NULL OR B.C IS NULL

この場合、知っておかなければならないのは、レコードが A には存在しないが B から来る列よりも B はNULLになり、同様に B であり A からの列は A はNULLになります。