2016-08-22 4 views
0

以下のサンプルが2つの異なるテーブルにあります。私は、同じソースキーを一緒にバインドされて比較するSQLを記述する必要があります。両方のテーブルのバインドキーが一致しません。比較グループには同じバインディングキーがあります

以下の例では、表1に3つのバインディングキー1,があります。3.バインディングキー1には、3つのメンバーABC、XYZ、& QBCが添付されています。同様にバインディングキー2 & 3にはそれぞれ2つのソースキーが添付されています。

表2において、バインディングキー99は、テーブル1のバインディングキー2と同じカウントを有するが、それらのソースキーは、テーブル1と同じ3つのキーが付いている(カウントとキーは同じ)異なる。 64は、1つのソースキーを持つキーバインディングとキー65の結合は、1

table 1: 
============================== 
Binding Key|source Key 
1|ABC 
1|XYZ 
1|QBC 
2|xxx 
2|yyy 
3|uuu 
3|ddd 

Table 2: 
========================== 
Binding Key|source Key 
99|XYZ 
99|QBC 
99|ABC 
78|xxx 
78|QQQ 
64|uuu 
65|ddd 

の予想される出力は、カウントまたはソース主要メンバーと一致doesntのグループを識別することである持っています。

Expected Output: 
=========================== 
xxx 
yyy 
uuu 
ddd 
QQQ 

多くのありがとう!!

答えて

1

解決策が見つかりました。同じグループ内の文字列を連結してそれらを比較するlistagg関数の助けを借りて。 SQLの例を以下に示します。

> SELECT * FROM (SELECT grp , 
>  ListAgg(elmnt, ',') within GROUP ( ORDER BY pos) AS list FROM table1 GROUP BY grp ) table1 WHERE table1.list NOT IN 
> (SELECT ListAgg(elmnt, ',') within GROUP ( ORDER BY pos) AS list 
> FROM table2 GROUP BY grp ) UNION SELECT * FROM (SELECT grp , 
>  ListAgg(elmnt, ',') within GROUP ( ORDER BY pos) AS list FROM table2 GROUP BY grp ) table1 WHERE table1.list NOT IN 
> (SELECT ListAgg(elmnt, ',') within GROUP ( ORDER BY pos) AS list 
> FROM table1 GROUP BY grp ) ; 
0

このクエリは、所望の出力が得られます。

with t1 as (select row_number() over (partition by grp order by elmnt) pos, 
        grp, elmnt from table1), 
    t2 as (select row_number() over (partition by grp order by elmnt) pos, 
        grp, elmnt from table2), 
    tx1 as (select pos, grp grp1, elmnt, 
        listagg(elmnt, ',') within group (order by pos) 
             over (partition by grp) list 
       from t1), 
    tx2 as (select pos, grp grp2, elmnt, 
        listagg(elmnt, ',') within group (order by pos) 
             over (partition by grp) list 
       from t2) 
select distinct elmnt 
    from (select * from tx1 full join tx2 using (list, elmnt)) 
    where grp1 is null or grp2 is null; 

あなたは簡単にだけdistinct listdistinct elmntを置き換え、リストを表示するには、それを変更することができます。あなたの答えと私のクエリの違いは、アナリティックバージョンであり、の代わりにunionと2つのnot inという句を組み合わせたものです。 最初の2つのサブクエリ(t1t2)は、posというカラムしか追加していません。元の質問では表示されませんでした;-)おそらくこれはminusオペレータでも実行できます。

テストデータ出力:代替ソリューションの

create table table1 (grp number(3), elmnt varchar2(5)); 
insert into table1 values (1, 'ABC'); 
insert into table1 values (1, 'XYZ'); 
insert into table1 values (1, 'QBC'); 
insert into table1 values (2, 'xxx'); 
insert into table1 values (2, 'yyy'); 
insert into table1 values (3, 'uuu'); 
insert into table1 values (3, 'ddd'); 

create table table2 (grp number(3), elmnt varchar2(5)); 
insert into table2 values (99, 'XYZ'); 
insert into table2 values (99, 'QBC'); 
insert into table2 values (99, 'ABC'); 
insert into table2 values (78, 'xxx'); 
insert into table2 values (78, 'QQQ'); 
insert into table2 values (64, 'uuu'); 
insert into table2 values (65, 'ddd'); 

ELMNT 
----- 
uuu 
QQQ 
yyy 
ddd 
xxx 
+0

おかげ。私はあなたのソリューションが好きです。グループ内の注文が同じように動作する必要がある場合、なぜグループシーケンスが生成されますか? –

関連する問題