在Oracle中两个结构相同的表之间执行“diff”的最佳方法是什么?它们有两种不同的模式(彼此可见)。
谢谢,
答案 0 :(得分:4)
如果您没有像PLSQL开发人员这样的工具,则可以将两个表完全连接到外部。如果他们有主键,您可以在连接中使用它。这将使您可以即时查看任一表中缺失的记录。 然后,对于两个表中都存在的记录,您可以比较每个字段。您应该注意,您无法将null与regular =运算符进行比较,因此检查是table1.field1 = table2.field1如果两个字段都为空,则返回false。因此,如果每个字段具有与其他表中相同的值,或者两者都为空,则必须检查每个字段。
您的查询可能如下所示(要返回不匹配的记录):
select
*
from
table1 t1
full outer join table2 t2 on t2.id = t1.id
where
-- Only one record exists
t1.id is null or t2.id is null or
( -- The not = takes care of one of the fields being null
not (t1.field1 = t2.field1) and
-- and they cannot both be null
(t1.field1 is not null or t2.field1 is not null)
)
您必须为每个字段复制该field1条件。当然,您可以编写一个函数来比较字段数据以使查询更容易,但是您应该记住,当您需要比较两个大表时,这可能会显着降低性能。
如果您的表没有主键,则需要交叉连接它们并对每个结果记录执行这些检查。您可以通过在每个必填字段上使用完全外连接来加快速度,因为它不能为空,因此可以在连接中使用。
答案 1 :(得分:4)
假设您想比较两个表中的数据(整行上的差异):
SELECT *
FROM (SELECT 's1.t' "Row Source", a.*
FROM (SELECT col1, col2
FROM s1.t tbl1
MINUS
SELECT col1, col2
FROM s2.t tbl2) a
UNION ALL
SELECT 's2.t', b.*
FROM (SELECT col1, col2
FROM s2.t tbl2
MINUS
SELECT col1, col2
FROM s1.t tbl1) b)
ORDER BY 1;
有关比较两个表的更多info。