0

我有两个具有相似结构的下表,其中 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 与哪个 amt 不匹配,所以我制作了这样的简单脚本:

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

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

4

2 回答 2

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 中显示结果。

这将不得不变得过于动态。取决于要求

于 2013-03-05T21:16:03.980 回答
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.FULL OUTER JOIN如果您还想在 table1 中查找 table2 中不存在的行,则可以更改为,反之亦然。

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

于 2013-03-05T21:19:38.793 回答