2017-08-01 6 views
1

私は異なる日から同じデータベースの2つのインスタンスを持っています。ある日のすべてのテーブルはtableA *と呼ばれ、他のテーブルB *から呼び出されます。私は何が変わったのかを見るためにデータを比較したいと思います。私は正確に一致しないすべての行を選択したいと思います。たとえば、テーブルのtableA1とtableB1の値が異なる場合は、テーブルAから対応する行を選択し、それを 'new'としてマークし、テーブルBから 'deleted'としてマークします。私はこのようなクエリを使用してみました:データベースの2つのインスタンスからのデータを一致させるためのPSQLクエリ

SELECT 'new', ta1.name, ta2.name, ta3.name, ta4.name, ta5.name 
FROM tableA1 ta1 
LEFT JOIN tableA2 ta2 ON ta1.ta2_id = ta2.id 
LEFT JOIN tableA3 ta3 ON ta1.ta3_id = ta3.id 
LEFT JOIN tableA4 ta4 ON ta1.ta4_id = ta4.id 
LEFT JOIN tableA5 ta5 ON ta5.ta1_id = ta1.id WHERE NOT EXISTS 
(SELECT tb1.name, tb2.name, tb3.name, tb4.name, tb5.name 
FROM tableB1 tb1 
LEFT JOIN tableB2 tb2 ON tb1.tb2_id = tb2.id 
LEFT JOIN tableB3 tb3 ON tb1.tb3_id = tb3.id 
LEFT JOIN tableB4 tb4 ON tb1.tb4_id = tb4.id 
LEFT JOIN tableB5 tb5 ON tb5.tb1_id = tb1.id WHERE 
tb1.name = ta1.name AND 
tb2.name = ta2.name AND 
tb3.name = ta3.name AND 
tb4.name = ta4.name AND 
tb5.name = ta5.name) 
UNION 
SELECT 'deleted', tb1.name, tb2.name, tb3.name, tb4.name, tb5.name 
FROM tableB1 tb1 
LEFT JOIN tableB2 tb2 ON tb1.tb2_id = tb2.id 
LEFT JOIN tableB3 tb3 ON tb1.tb3_id = tb3.id 
LEFT JOIN tableB4 tb4 ON tb1.tb4_id = tb4.id 
LEFT JOIN tableB5 tb5 ON tb5.tb1_id = tb1.id WHERE NOT EXISTS 
(SELECT ta1.name, ta2.name, ta3.name, ta4.name, ta5.name 
FROM tableA1 ta1 
LEFT JOIN tableA2 ta2 ON ta1.ta2_id = ta2.id 
LEFT JOIN tableA3 ta3 ON ta1.ta3_id = ta3.id 
LEFT JOIN tableA4 ta4 ON ta1.ta4_id = ta4.id 
LEFT JOIN tableA5 ta5 ON ta5.ta1_id = ta1.id WHERE 
tb1.name = ta1.name AND 
tb2.name = ta2.name AND 
tb3.name = ta3.name AND 
tb4.name = ta4.name AND 
tb5.name = ta5.name) 

私は同じstuructreを作成し、すべての値を比較した場合、私が予想した結果になるだろうことを期待します。データベースが同じであっても、選択された行が多くなります。

答えて

0

問題が見つかりました。 2つのNULL値を比較すると結果はFALSEになります。クエリ自体は正常でなければなりません。だから、値がNULLかどうかをチェックするための条件を追加する必要があります。

関連する問題