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

10-53 having句でall述語

SQLパズル

テーブル
ID  Flag
--  ----
 1     1
 1     1
 1     0
 2     1
 2     1
 3     3
 3     0
 3     0

Flag(Not null)が1しかないIDを出力する

出力結果
ID
--
 2

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


SQL

--■■■having句でall述語を使う方法■■■
select ID
from (select 1 as ID,1 as Flag from dual
    union all select 1,1 from dual
    union all select 1,0 from dual
    union all select 2,1 from dual
    union all select 2,1 from dual
    union all select 3,3 from dual
    union all select 3,0 from dual
    union all select 3,0 from dual)
group by ID
having 1 = all(min(Flag),max(Flag));

--■■■having句でdecode関数を使う方法■■■
select ID
from (select 1 as ID,1 as Flag from dual
    union all select 1,1 from dual
    union all select 1,0 from dual
    union all select 2,1 from dual
    union all select 2,1 from dual
    union all select 3,3 from dual
    union all select 3,0 from dual
    union all select 3,0 from dual)
group by ID
having min(decode(Flag,1,1,0)) = 1;


解説

having句でall述語を使う方法では、
最小値が1で、かつ、最大値も1ならば、1以外の値が存在しない
というロジックを使ってます

集合で考える ―― HAVING句の力:その2
Thinking in Aggregates(英語)