在 Oracle 中进行表同步报告的优雅方式?

Posted

技术标签:

【中文标题】在 Oracle 中进行表同步报告的优雅方式?【英文标题】:Elegant way of doing table sync reports in Oracle? 【发布时间】:2010-11-12 13:58:08 【问题描述】:

所以我有两张桌子

TABLE_A

KEYA | VALUE
1    |  1.2
2    |  2.3
3    |  8.3

TABLE_B

KEYB | VALUE
1    |  1.2
3    |  1.6
4    |  5.5

我想创建这两个表之间的同步状态报告。 IE。为每个记录以下信息:

    记录 X 在 TABLE_A 中,但不在 TABLE_B 中 记录 X 在 TABLE_B 中,但不在 TABLE_A 中 记录 X 存在于两个表中,但 VALUE 不同 (已同步的记录不会出现在报告中)

我真的不需要文本(实际上,我不想要它)。可能只是值本身:

[Table_A.KEYA (if present)]|[Table_A.Value (if present)]|[Table_B.KEYB (if present)]|[Table_B.Value (if present)]

给定的示例表应该产生:

|2|2.3| |   |
|3|8.3|3|1.6|
| |   |4|5.5|

我目前正在使用长系列的连接和减号来执行此操作,但我认为这对于 DB 来说应该很常见,而 Oracle 可能有一种更优雅(并且可能更有效)的方式来做这件事。有没有人可以拍一些tips?

谢谢!

f.

【问题讨论】:

【参考方案1】:
select a.keya, a.value a_value, b.keyb, b.value b_value
from table_a a
full outer join table_b b
on a.keya = b.keyb
where a.keya IS NULL
or b.keya IS NULL
or (a.value is null and b.value is not null)
or (a.value is not null and b.value is null)
or a.value <> b.value

【讨论】:

【参考方案2】:

我认为加入和减去都很好:-)

上面的例子会给出类似的东西

select *, null, null
from a
where not exists (select keyb
  from b 
  where keyb = a.keya)
union all
select a.*, b.*
from a, b
where a.keya = b.keya
and a.value <> b.value -- please extend if null values are allowed
union all
select null, null, *
from b
where not exists (select keya
  from a
  where keya = b.keyb)

它很快就会因为很多列而变得混乱。

【讨论】:

以上是关于在 Oracle 中进行表同步报告的优雅方式?的主要内容,如果未能解决你的问题,请参考以下文章

报告 data.frame 中缺失值的优雅方式

C - 用信号量同步多个孩子的优雅方式

两个oracle数据库个有部分数据要同步给对方怎么办?

Oracle数据迁移MySQL

SpringBoot实现多数据源(实战源码)

如何同步两个mysql数据库中所有的表