我有两个具有相似结构的下表,其中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
任何人都可以显示哪些查询可以生成如上所示的输出。
答案 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.我没有删除列表中的尾随逗号。