トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-240 和集合を作成してソート

SQLパズル

TEST1         TEST2
ColA  ColB    ColA  ColB
----  ----    ----  ----
   1  AAAA       1  DDDD
   2  BBBB       2  BBBB
   3  CCCC       3  EEEE

TEST1に存在する行の昇順
TEST2に存在して、TEST1に存在しない行の昇順
で行を出力する。

出力結果
ColA  ColB
----  ----
   1  AAAA
   2  BBBB
   3  CCCC
   1  DDDD
   3  EEEE


データ作成スクリプト

create table TEST1(ColA,ColB) as
select 1,'AAAA' from dual union
select 2,'BBBB' from dual union
select 3,'CCCC' from dual;

create table TEST2(ColA,ColB) as
select 1,'DDDD' from dual union
select 2,'BBBB' from dual union
select 3,'EEEE' from dual;


SQL

select ColA,ColB
from (select 1 as ID,ColA,ColB from TEST1 union all
      select 2      ,ColA,ColB from TEST2)
group by ColA,ColB
order by min(ID),ColA,ColB;


解説

ベン図の3つの場所、
   _        _
A∩B  A∩B  A∩B
の3通りの場合に分けて検証してるのです。

4-16 重複排除とソート
10-274 distinct後のorder by

ベン図 - Wikipedia
なぜ場合分けが必要か