2017-08-01 75 views
1

我有兩個不同日期的同一個數據庫實例。一天中的所有表格稱爲tableA *和另一個表格B *。我想比較一下數據,看看有什麼變化。我想選擇所有不完全匹配的行。因此,例如,如果tableA1和tableB1中的一個值不同,我想從表A中選擇相應的行並將其標記爲「新」,並從表B標記爲「已刪除」。我試着用這樣的查詢:PSQL查詢以comapre數據庫的兩個實例的數據

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

發現問題。當比較兩個NULL值時,結果是FALSE,查詢本身應該沒問題。所以我應該添加條件來檢查值是否爲NULL。