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

9-39 重複を排除して二つかチェック

SQLパズル

BookTableテーブル
contributor  title          category
-----------  ------------   --------
      Heidy  RegexPuzzle1   Regex
      Heidy  RegexPuzzle2   Regex
      Heidy  RegexPuzzle3   Regex
      Heidy  RegexPuzzle3   Math
      Scott  Math1          Math
      Scott  Math2          Math
      Scott  Math3          Math
      Tiger  algorithm1     Algorithm
      Tiger  algorithm1     Math
      Wendy  SQLPuzzle1     SQL
      Wendy  SQLPuzzle1     Oracle
      Wendy  SQLPuzzle2     SQL
      Wendy  SQLPuzzle2     Oracle

contributorごとに、
重複したcategoryを1つと数えて、
categoryの種類が2種類となる
contributorを出力する

出力結果
contributor
-----------
      Heidy
      Tiger
      Wendy

SQLパズル(日本語版)のパズル46 [3つの中の2つ] を参考にさせていただきました
SQLパズル 第2版のパズル50 [3分の2] を参考にさせていただきました


データ作成スクリプト

create table BookTable(
contributor varchar2(5)  not null,
title       varchar2(12) not null,
category    varchar2(9)  not null);

insert into BookTable values('Heidy','RegexPuzzle1','Regex');
insert into BookTable values('Heidy','RegexPuzzle2','Regex');
insert into BookTable values('Heidy','RegexPuzzle3','Regex');
insert into BookTable values('Heidy','RegexPuzzle3','Math');
insert into BookTable values('Scott','Math1','Math');
insert into BookTable values('Scott','Math2','Math');
insert into BookTable values('Scott','Math3','Math');
insert into BookTable values('Tiger','Algorithm1','Algorithm');
insert into BookTable values('Tiger','Algorithm1','Math');
insert into BookTable values('Wendy','SQLPuzzle1','SQL');
insert into BookTable values('Wendy','SQLPuzzle1','Oracle');
insert into BookTable values('Wendy','SQLPuzzle2','SQL');
insert into BookTable values('Wendy','SQLPuzzle2','Oracle');
commit;


SQL

select contributor
  from BookTable
group by contributor
having count(distinct category) = 2
order by contributor;


解説

having句で、
distinctオプションを指定したcount関数を使ってます