この StackOverflow questionに似た問題がありますが、特定のフィールドを比較から除外する必要がありますが、それでも結果セットに含める必要があります。
私は問題を局所対称差としてペンニングしています。
たとえば、テーブル A と B には列 X、Y、Z があり、違いについて Y、Z のみを比較したいのですが、結果セットに X を含めたいとします。
この StackOverflow questionに似た問題がありますが、特定のフィールドを比較から除外する必要がありますが、それでも結果セットに含める必要があります。
私は問題を局所対称差としてペンニングしています。
たとえば、テーブル A と B には列 X、Y、Z があり、違いについて Y、Z のみを比較したいのですが、結果セットに X を含めたいとします。
これは基本的にあなたが望むもののように聞こえます。Y 列と Z 列で 2 つのテーブルの行を一致させ、一致しない行を見つけて、X、Y、Z 列の値を出力します。
SELECT a.x, a.y, a.z, b.x, b.y, b.z
FROM a FULL OUTER JOIN b ON a.y = b.y AND a.z = b.z
WHERE a.y IS NULL OR b.y IS NULL
完全結合の古いスタイルの SQL - A と B を連結し、B 内の行を A 内にも除外します (中央):
-- all rows in A with or without matching B
select a.x, a.y, a.z
from a
left join b
on a.x = b.x
and a.y = b.y
union all
-- all rows in B with no match in A to "exclude the middle"
select b.x, b.y, null as z
from b
where not exists (select null
from a
where b.x = a.x
and b.y = a.y)
ANSI スタイル:
select coalesce(a.x, b.x) as x,
coalesce(a.y, b.y) as y,
a.z
from a
full outer join b
on a.x = b.x
and a.y = b.y
合体は安全のためにあります。現実の世界で完全な外部結合を作成する理由が実際にあったことはありません。
2 つのテーブルが同一かどうかを本当に知りたい場合は、次のようにします。
SELECT COUNT(*)
FROM (SELECT list_of_columns
FROM one_of_the_tables
MINUS
SELECT list_of_columns
FROM the_other_table
UNION ALL
SELECT list_of_columns
FROM the_other_table
MINUS
SELECT list_of_columns
FROM one_of_the_tables)
それがゼロ以外の結果を返す場合、違いがあります。それがどのテーブルにあるかはわかりませんが、それが始まりです。