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

10-249 共通集合が空集合なら、元の集合を出力

SQLパズル

ATable    BTable
Val       Val
---       ---
  1         2
  2         3
  3

Aテーブルと、Bテーブルの共通集合を出力する。
ただし、それが空集合ならAテーブルを出力する。

出力結果
Val
---
  2
  3

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
共通集合が空集合のパターン

ATable    BTable
Val       Val
---       ---
  5         2
  6         3

出力結果
Val
---
  5
  6

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table A(Val number(1));
create table B(Val number(1));

--■■■パターン1(共通集合が空集合でないパターン)■■■
truncate table A;
truncate table B;

insert all
into A values(1)
into A values(2)
into A values(3)
into B values(2)
into B values(3)
select 1 from dual;
commit;

--■■■パターン2(共通集合が空集合のパターン)■■■
truncate table A;
truncate table B;

insert all
into A values(5)
into A values(6)
into B values(2)
into B values(3)
select 1 from dual;
commit;


SQL

select aVal as Val
from (select a.Val as aVal,b.Val as bVal,
      max(b.Val) over() as hasNull
        from A Left Join B
          on a.Val = b.Val)
 where hasNull is null
    or bVal is not null
order by aVal;


解説

外部結合してから分析関数のmax関数を使い、
共通集合が空集合かを調べています。