このクエリは、所望の出力が得られます。
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 list
でdistinct elmnt
を置き換え、リストを表示するには、それを変更することができます。あなたの答えと私のクエリの違いは、アナリティックバージョンであり、の代わりにunion
と2つのnot in
という句を組み合わせたものです。 最初の2つのサブクエリ(t1
とt2
)は、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
おかげ。私はあなたのソリューションが好きです。グループ内の注文が同じように動作する必要がある場合、なぜグループシーケンスが生成されますか? –