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 - 两个表中两行之间的差异或变化的主要内容,如果未能解决你的问题,请参考以下文章

计算两个不相邻行之间的差异

引导表中两行之间的空格

如何获取同一列中两行之间的差异

MySQL Workbench中两行之间的差异,但未授权LAG

计算Postgresql中两列之间的运行差异

通过多个标签过滤或选择熊猫中两行之间的数据