【问题标题】:Oracle Compare data between two different tableOracle比较两个不同表之间的数据
【发布时间】:2023-03-06 11:41:01
【问题描述】:

我有两个表,其中一个具有所有字段 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
==========================

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

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

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

现在在表一的唯一键的帮助下,我们必须在表二中找到相同的行并逐列比较行并获取数据的变化。 目前我们正在使用java程序逐行逐列比较数据,并获取具有相同UNIQUE KEY的行中数据之间的变化。它工作正常,但由于我们在 DB 中有 100000 条记录而花费了太多时间。

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

【问题讨论】:

  • 请提供样本数据和预期结果。考虑构建一个SQLfiddle.com 模型
  • 什么是“长路漫漫”?如果您在 Java 中正确实现了这一点,您应该能够立即比较两个包含 100.000 个项目的列表,因此大部分时间都在加载数据本身。
  • 使用包含列名的映射表,您必须构建一个 PL/SQL 函数,该函数在系统表 all_tab_cols 的帮助下基于该表构建动态查询。但是,如果您准备好忽略映射表并简单地对列名进行硬编码(为什么不呢?无论如何列名应该是静态的!),您可以编写一个直接的 SQL 查询。

标签: sql oracle


【解决方案1】:

您可以通过这样的查询“手动”执行此操作:工作量很大,但您只需要执行三种不同类型的检查,因此不是很复杂:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2021-01-08
    • 2021-04-23
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多