2010-11-12 65 views
1

所以,我有我的两个表在Oracle中执行表同步报告的优雅方式?

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但不是在表-B
  2. 记录X在表-B但不是在TABLE_A
  3. 记录X存在两个表中,但在不同VALUE
  4. (记录同步将不会出现在报告中)

我并不真正需要的文本(其实,我不希望它)。可能只是值本身:

[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| 

我目前做的是与多头系列加入的优缺点周围的一切,但想通这应该是相当数据库和Oracle的共同点可能有一个更优雅(也可能更有效)的方式。有谁可以拍摄一些提示?

非常感谢!

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 
+0

这就是我的意思:) – filippo 2010-11-16 11:20:34

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) 

它很快就会变得混乱,有很多列。