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

时间:2010-11-12 13:58:09

标签: oracle join intersection

所以我有两张桌子

TABLE_A

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

表-B

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

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

  1. 记录X在TABLE_A中,但不在TABLE_B
  2. 记录X在TABLE_B中,但不在TABLE_A
  3. 记录X出现在两个表中但在VALUE中有所不同
  4. (同步的记录不会出现在报告中)
  5. 我真的不需要文本(实际上,我不想要它)。可能只是价值本身:

    [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可能有更优雅(可能更有效)的方式。谁能拍出一些小贴士?

    谢谢你!

    F。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

以上示例将提供类似

的内容
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)

许多专栏很快就会变得混乱。