【问题标题】:Oracle - difference or changes between two rows from two tablesOracle - 两个表中两行之间的差异或变化
【发布时间】:2009-10-19 21:23:30
【问题描述】:

我有两个表都有相同的模式,一个将有前一天的记录,另一个将有当前的。我想比较两者并仅找到更改或仅在至少一列中具有不同值的行。

在 pl/sql、oracle 中这怎么可能? (我在 T-SQL 中使用校验和编写了类似的代码,但不确定如何在 pl/sql 中执行)

【问题讨论】:

    标签: sql oracle plsql oracle10g


    【解决方案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);
      

      【讨论】:

      • 这也是一个非常有效的解决方案(不能接受两个答案:()
      猜你喜欢
      • 1970-01-01
      • 2014-01-12
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      相关资源
      最近更新 更多