Oracle - 两个表中两行之间的差异或变化
Posted
技术标签:
【中文标题】Oracle - 两个表中两行之间的差异或变化【英文标题】:Oracle - difference or changes between two rows from two tables 【发布时间】:2009-10-19 21:23:30 【问题描述】:我有两个表都有相同的模式,一个将有前一天的记录,另一个将有当前的。我想比较两者并仅找到更改或仅在至少一列中具有不同值的行。
在 pl/sql、oracle 中这怎么可能? (我在 T-SQL 中使用校验和编写了类似的代码,但不确定如何在 pl/sql 中执行)
【问题讨论】:
【参考方案1】:这个 SO 答案提供了一个非常有效的解决方案,使用 Oracle 来比较 2 个查询的结果:Proving SQL query equivalency
【讨论】:
【参考方案2】:您想要一个排他性差异查询,它本质上是一个 (A-B) U (B-A) 查询:
(SELECT * FROM TODAY_TABLE
MINUS
SELECT * FROM YESTERDAY_TABLE)
UNION ALL
(SELECT * FROM YESTERDAY_TABLE
MINUS
SELECT * FROM TODAY_TABLE)
还可以轻松改进此查询,以使用额外的计算列显示哪些记录是插入、删除和更改。
【讨论】:
这也很好用,但是doughman 和 vincent 给出了更有效的解决方案【参考方案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);
【讨论】:
这也是一个非常有效的解决方案(不能接受两个答案:()以上是关于Oracle - 两个表中两行之间的差异或变化的主要内容,如果未能解决你的问题,请参考以下文章