2009-10-19 45 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