【发布时间】:2009-10-19 21:23:30
【问题描述】:
我有两个表都有相同的模式,一个将有前一天的记录,另一个将有当前的。我想比较两者并仅找到更改或仅在至少一列中具有不同值的行。
在 pl/sql、oracle 中这怎么可能? (我在 T-SQL 中使用校验和编写了类似的代码,但不确定如何在 pl/sql 中执行)
【问题讨论】:
标签: sql oracle plsql oracle10g
我有两个表都有相同的模式,一个将有前一天的记录,另一个将有当前的。我想比较两者并仅找到更改或仅在至少一列中具有不同值的行。
在 pl/sql、oracle 中这怎么可能? (我在 T-SQL 中使用校验和编写了类似的代码,但不确定如何在 pl/sql 中执行)
【问题讨论】:
标签: sql oracle plsql oracle10g
这个 SO 答案提供了一个非常有效的解决方案,使用 Oracle 来比较 2 个查询的结果:Proving SQL query equivalency
【讨论】:
您想要一个排他性差异查询,它本质上是一个 (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)
还可以轻松改进此查询,以使用额外的计算列显示哪些记录是插入、删除和更改。
【讨论】:
作为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);
【讨论】: