在两个表中获取column_name不同

时间:2013-03-05 21:06:46

标签: sql oracle oracle10g

我有两个具有相似结构的下表,其中id1和id2为唯一:

             Table1
id1    id2   amt1    amt2    id3
1A      1     12      14     12A
2A      4     23      35     34V
3A      8     45      23     13D
.................................

            Table2
id1    id2   amt1    amt2    id3
1A      1     12      27     12A
2A      4     67      35     34D
3A      8     45      23     13D


.................................

所以id1和id2在这里是唯一的,所以我想创建一个查询,告诉我哪个id不匹配所以我创建了这样的简单脚本:

select T.id1,T.id2,
T.amt1,      P.amt1,
T.amt2,      P.amt2,
T.id3,       P.id3
from 
Table1 T,
Table2 P
where 
T.id1=P.id1
T.id2=P.id2
(
nvl(T.amt1 ,0)-nvl(P.amt1 ,0)<>0 OR      --used nvl to check if one table has null for other tables's number
nvl(T.amt2 ,0)-nvl(P.amt2 ,0)<>0 OR
T.id3  <>P.id3  
);

这给了我差异,但我很难分析大表,并假设我有很多列和数量和很多差异我想看到如下所示格式的输出: 假设我正在寻找Table1

中的差异
id1  id2  difference in column
1A    1       amt2
2A    4       amt1,id3

任何人都可以显示哪些查询可以生成如上所示的输出。

2 个答案:

答案 0 :(得分:2)

使用以下查询和测试:

select * from (select T.id1,T.id2,
T.amt1,      P.amt1,
T.amt2,      P.amt2,
T.id3,       P.id3
decode(nvl(T.amt1 ,0)-nvl(P.amt1 ,0),0,'','amt1')||' '||decode(nvl(T.amt2 ,0)-nvl(P.amt2 ,0),0,'','amt2')||' '||decode(nvl(T.id3 ,0),nvl(P.id3 ,0),'','ID3') difference_in_col
from 
Table1 T,
Table2 P
where 
T.id1=P.id1
and T.id2=P.id2
) where difference_in_col is not null;

这假设您只有有限的已知列数。

如果没有,那么你将不得不去一个过程脚本来填充一个表或在dbms_output中显示结果。

必须变得过于动态。取决于要求

答案 1 :(得分:1)

下面这个令人费解的(和未经测试的)SQL的可怕野兽怎么样?

select id1
      ,id2
      ,decode(a.amt1, b.amt1, null, 'amt1,') ||
       decode(a.amt2, b.amt2, null, 'amt2,') || 
       decode(a.id3,  b.id3,  null, 'id3,') as difference_in_column
  from table1 a
  join table2 b using(id1, id2)
 where decode(a.amt1, b.amt1, 1, 0) = 0
    or decode(a.amt2, b.amt2, 1, 0) = 0
    or decode(a.id3,  b.id3,  1, 0) = 0;

注意1.我使用了decode()构造,因为它将null视为等于null。

注意2.如果您还想在table1中找到table2或者verca中不存在的行,则可以更改为FULL OUTER JOIN

注意3.我没有删除列表中的尾随逗号。