2009-10-19 110 views
3

我有兩個表都有相同的模式,一個將有前一天的記錄,其他將有當前。我想比較兩者並只查找更改或者只查找在至少一列中具有不同值的行。Oracle - 兩個表中兩行之間的差異或變化

這是怎麼可能在PL/SQL,甲骨文? (我在T-SQL中使用校驗和做了類似的代碼,但不知道如何在pl/sql中執行)

回答

3

您想要一個排他性差異查詢,它本質上是一個(AB)U(BA)查詢:

(SELECT * FROM TODAY_TABLE 
MINUS 
SELECT * FROM YESTERDAY_TABLE) 
UNION ALL 
(SELECT * FROM YESTERDAY_TABLE 
MINUS 
SELECT * FROM TODAY_TABLE) 

此查詢也可以很容易地改進,以顯示哪些記錄是插入,刪除和使用額外的計算列進行更改。

+0

這也是偉大的工程,但doughman和Vincent給更有效的解決方案 – 2009-10-20 14:20:39

3

作爲最有效的方式來比較兩個數據集Dougman posted一個是將它們分組。我通常使用這樣的查詢來比較兩個表:

SELECT MIN(which), COUNT(*), pk, col1, col2, col3, col4 
    FROM (SELECT 'old data' which, pk, col1, col2, col3, col4 
      FROM t 
     UNION ALL 
     SELECT 'new data' which, pk, col1, col2, col3, col4 FROM t_new) 
GROUP BY pk, col1, col2, col3, col4 
HAVING COUNT(*) != 2 
ORDER BY pk, MIN(which); 
+0

這也是一個非常有效的解決方案 (不能接受兩個答案:() – 2009-10-20 14:38:18