0

id1 と id2 が一意である同様の構造を持つ次の 2 つのテーブルがあります。

             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 はここでは一意であるため、amt が一致しない 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

上記のような出力を生成できるクエリを誰でも示すことができますか。

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. null を null と同等に扱うため、decode() コンストラクトを使用しました。

注 2. FULL OUTER JOINtable2 に存在しない table1 の行も検索したい場合、またはその逆の場合に変更できます。

注 3. リストの末尾のコンマは削除していません。

于 2013-03-05T21:19:38.793 に答える