SQLの局所的な対称差
-
01-10-2019 - |
質問
私には似たような問題があります このスタックフローの質問, 、比較から特定のフィールドを除外する必要があるが、結果セットにそれを含める必要があることを除いて。
私は局所的に対称的な違いとして問題を書いています。
たとえば、表AとBには列x、y、zがあり、違いについてy、zのみを比較したいのですが、結果はxを含むように設定したいと思います。
解決
完全な結合のための古いスタイルの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
Coalesceは安全のためにあります。私は実際に現実の世界に完全な外側の結合を書く原因を持っていませんでした。
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)
それがゼロ以外の結果を返す場合、違いがあります。どのテーブルが入っているかはわかりませんが、スタートです。
他のヒント
これは基本的にあなたが望むもののように聞こえます。列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
所属していません StackOverflow