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

13-2 Find_In_Setでの他テーブルの参照

SQLパズル

HumanTable
name  LangCodeList
----  ------------
aaaa  1,2,3,4,5
bbbb  1
cccc  1,3,5
dddd  2,3,4
eeee  4,5

LangTable
LangCode  LangName
--------  ---------
       1  C++
       2  C#
       3  Python
       4  Java
       5  PHP

C#やPythonといった検索ワードが指定されるので
その言語のコードを、LangCodeListに持つ人のnameを表示する

出力結果 (Pythonが検索ワードの場合)
name
----
aaaa
cccc
dddd


データ作成スクリプト

create table HumanTable(
name varchar(4),
LangCodeList varchar(100));

insert into HumanTable
values('aaaa' , '1,2,3,4,5'),
      ('bbbb' , '1'),
      ('cccc' , '1,3,5'),
      ('dddd' , '2,3,4'),
      ('eeee' , '4,5');

create table LangTable(
LangCode int,
LangName varchar(10));

insert into LangTable
values(1,'C++'),
      (2,'C#'),
      (3,'Python'),
      (4,'Java'),
      (5,'PHP');


SQL

-- ■■■ Exists述語を使う方法 ■■■
select name
  from HumanTable a
where exists(select 1 from LangTable b
              where b.LangName = 'Python'
                and Find_In_Set(b.LangCode , a.LangCodeList));

-- ■■■ スカラーサブクエリを使う方法 ■■■
select name
  from HumanTable a
where Find_In_Set((select b.LangCode
                      from LangTable b
                    where b.LangName = 'Python') , a.LangCodeList);


解説

Exists述語を使う方法が
分かりやすいと思います。