Oracle比较两个不同表之间的数据

时间:2014-08-20 06:48:15

标签: sql oracle

我有两个表,其中包含所有字段VARCHAR2,但其他字段具有不同类型的不同数据。

例如:

Table One
==========================
Col 1           VARCHAR2  UNIQUE KEY
Col 2           VARCHAR2
Col 3           VARCHAR2
===========================

Table Two
==========================
Col One         VARCHAR2  UNIQUE KEY
Col Two         TIMESTAMP
Col Three       NUMBER
==========================

我们有一个映射表。它表示表1的哪一列必须与表2的哪一列进行比较。 例如

Mapping Table
==============================
Table One           Table Two
==============================

Col 1               Col One
Col 2               Col Three
Col 3               Col Two
==============================

现在借助表一的UNIQUE KEY,我们必须在TABLE TWO中找到相同的行,并逐列比较行并获取数据的变化。 目前我们正在使用java程序逐行和逐列地比较数据,并使用相同的UNIQUE KEY在行中的数据之间进行更改。它工作正常,但由于我们在数据库中拥有100000条记录,所以花费了太多时间。

现在我的问题是:有什么方法可以比较SQL级别的数据并获取数据变化?

1 个答案:

答案 0 :(得分:2)

你可以手动'这样的查询:它需要做很多工作,但是你需要做三种不同类型的检查,所以它不是很复杂:

select
  *
from
  Table1 t1
  full outer join Table2 t2 on t2.ID = t1.ID
where
  -- Check ID, either record does not exist in either table.
  t1.ID is null or 
  t2.ID = null or
  -- Not nullable field can be easily compared.
  t1.NotNullableField1 <> t2.NotNUllableField1 or
  -- Nullable field is slightly more work.
  t1.NullableField1 <> t2.NullableField1 or
  (t1.NullableField1 is null and t2.NullableField1 is not null) or
  (t1.NullableField1 is not null and t2.NullableField1 is null)

另一个解决方案是使用MINUS,它有点像UNION,只返回数据集减去第二个数据集中的记录:

select * from Table1 t1
MINUS
select * from Table2 t2

这只能用于一种方式(可能适用于您的目的),但您也可以将它与UNION结合使用,使其成为双向的。

select
  *
from
    ( select * from Table1
      MINUS
      select * from Table2)
    UNION ALL
    ( select * from Table2
      MINUS
      select * from Table1)

两种解决方案的输出略有不同。

在FULL OUTER JOIN查询中,ID将被连接,匹配行的值将作为单行彼此相邻显示。

在MINUS查询中,结果将显示为单个数据集。如果任何一个表中都不存在记录,则会显示该记录。如果两个表中都存在记录(ID),但其他字段不同,则将获得这两个行。所以比较它们有点困难。

请参阅:http://www.techonthenet.com/oracle/minus.php