表“Oracle中的差异”

时间:2010-12-23 00:24:34

标签: sql oracle

在Oracle中两个结构相同的表之间执行“diff”的最佳方法是什么?它们有两种不同的模式(彼此可见)。

谢谢,

2 个答案:

答案 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