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

10-244 存在肯定命題の論理和を同値変形

SQLパズル

CodeTable
ID  Code
--  ----
 1  AAAA
 1  BBBB
 1  CCCC
 2  AAAA
 2  BBBB
 2  DDDD
 3  BBBB
 3  EEEE
 4  BBBB
 5  EEEE
 6  AAAA
 7  DDDD
 8  AXXX
 8  BBBB
 9  AXXX
 9  CCCC

IDごとで、
Codeの先頭文字がAの行がある。
かつ
CodeがBBBB、または、CodeがCCCC、の行がある。
を満たすIDを出力する。

出力結果
ID
--
 1
 2
 8
 9

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


データ作成スクリプト

create table CodeTable(ID,Code) as
select 1,'AAAA' from dual union
select 1,'BBBB' from dual union
select 1,'CCCC' from dual union
select 2,'AAAA' from dual union
select 2,'BBBB' from dual union
select 2,'DDDD' from dual union
select 3,'BBBB' from dual union
select 3,'EEEE' from dual union
select 4,'BBBB' from dual union
select 5,'EEEE' from dual union
select 6,'AAAA' from dual union
select 7,'DDDD' from dual union
select 8,'AXXX' from dual union
select 8,'BBBB' from dual union
select 9,'AXXX' from dual union
select 9,'CCCC' from dual;


SQL

--■■■存在肯定命題の真偽で演算を行う方法1■■■
select ID
  from CodeTable
group by ID
having  max(case when code like 'A%' then 1 else 0 end)
           * (max(case when code = 'BBBB' then 1 else 0 end)
            + max(case when code = 'CCCC' then 1 else 0 end)) >= 1
order by ID;

--■■■存在肯定命題の真偽で演算を行う方法2■■■
select ID
  from CodeTable
group by ID
having max(case when code like 'A%'        then 1 else 0 end)
     * max(case when code in ('BBBB','CCCC') then 1 else 0 end) = 1
order by ID;


解説

2つの存在肯定命題の論理和の真偽は、
論理和の存在肯定命題の真偽に等しくなることを使って同値変形してます。

使いどころの例としては、論理和の条件が多い時ですね。
たとえば、
'BBBB'、または、'CCCC'、または、'DDDD'、または、'EEEE'
が少なくとも1つ存在する
のを条件とする場合です。