Postgresには、32バイトのラテンフィールド(単純なmd5ハッシュ)が1つだけある2つの同様のテーブルがあります。両方のテーブルには最大30,000,000行があります。テーブルにはほとんど違いがありません(10〜1000行が異なります)
Postgresでこれらのテーブル間の違いを見つけることは可能ですか?結果は上記の10〜1000行になるはずです。
これは実際のタスクではありません。PostgreSQLがJOINのようなロジックをどのように処理するかについて知りたいだけです。
最良のオプションはおそらく EXISTS
アンチセミジョインです:
tbl1
は、この例の余剰行を持つテーブルです。
SELECT *
FROM tbl1
WHERE NOT EXISTS (SELECT 1 FROM tbl2 WHERE tbl2.col = tbl1.col);
どのテーブルに余剰行があるか、または両方に余剰行があるかわからない場合は、テーブル名を切り替えた後に上記のクエリを繰り返すか、次のいずれかを実行できます。
SELECT *
FROM tbl1
FULL OUTER JOIN tbl2 USING (col)
WHERE tbl2 col IS NULL OR
tbl1.col IS NULL;
後の投稿で基本的なテクニックの概要:
ところで、md5ハッシュの列を使用する方がmuchより効率的です uuid
:
既存の回答を補強するために、結合条件にrow()
関数を使用します。これにより、行全体を比較できます。例えば。対称差を確認するための私の典型的なクエリは次のようになります
select *
from tbl1
full outer join tbl2
on row(tbl1) = row(tbl2)
where tbl1.col is null
or tbl2.col is null