我有两个表,其中包含所有字段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级别的数据并获取数据变化?
答案 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),但其他字段不同,则将获得这两个行。所以比较它们有点困难。