平成31年度 春期 データベーススペシャリスト試験 午前Ⅱ 問11
テクノロジ/データベース“社員取得資格”表に対し,SQL文を実行して結果を得た。SQL文のaに入れる字句はどれか。 〔SQL文〕 SELECT C1.社員コード, C1.資格 AS 資格1, C2.資格 AS 資格2 FROM 社員取得資格 C1 LEFT OUTER JOIN 社員取得資格 C2 [ a ]

出典:平成31年度 春期 データベーススペシャリスト試験 午前Ⅱ 問11
- アON C1.社員コード = C2.社員コード AND C1.資格 = 'FE' AND C2.資格 = 'AP' WHERE C1.資格 = 'FE'
- イON C1.社員コード = C2.社員コード AND C1.資格 = 'FE' AND C2.資格 = 'AP' WHERE C1.資格 IS NOT NULL
- ウON C1.社員コード = C2.社員コード AND C1.資格 = 'FE' AND C2.資格 = 'AP' WHERE C2.資格 = 'AP'
- エON C1.社員コード = C2.社員コード WHERE C1.資格 = 'FE' AND C2.資格 = 'AP'
正解:ア
解説
“社員取得資格”表を自己結合し,C1側で資格='FE'をもつ社員を軸に,同じ社員コードでC2側の資格='AP'をもつ行があれば資格2として取得し,なければNULLとするという処理です。LEFT OUTER JOINのON句にC1.社員コード=C2.社員コードとC1.資格='FE',C2.資格='AP'の条件を全て含めることで,C1側は資格='FE'の行に絞り込まれ,C2側は資格='AP'の行があれば結合し,なければNULLで埋められます。さらに外側のWHERE句でC1.資格='FE'と絞り込むことで,資格1がFEの社員だけが抽出されます。実際,S001はFEとAPの両方をもつため資格1=FE,資格2=APとなり,S002・S003はFEをもつがAPをもたないため資格1=FE,資格2=NULLとなり,結果表と一致します。
選択肢ごとの解説
- ア正しい。ON句でC1.資格='FE'とC2.資格='AP'を条件に含めたLEFT OUTER JOINとし,外側のWHERE句でC1.資格='FE'に絞り込むことで,資格1がFEである社員ごとに,APをもてば資格2にAP,もたなければNULLを設定する結果が得られます。
- イ誤り。外側のWHERE句をC1.資格 IS NOT NULLとしても,資格列にNULLの値をもつ社員(S005)以外は全て条件を満たしてしまい,資格1がFEでない社員(例えばSMやAPのみをもつ社員)まで抽出されてしまうため,結果表と一致しません。
- ウ誤り。外側のWHERE句をC2.資格='AP'とすると,C2側がNULLになる行(APをもたない社員,S002・S003など)がWHERE条件を満たさず除外されてしまい,資格2がNULLの行を含む結果表と一致しません。
- エ誤り。ON句に資格の条件を含めずWHERE句だけでC1.資格='FE'とC2.資格='AP'を指定すると,LEFT OUTER JOINの結合条件が社員コードの一致だけになり,さらに外側のWHERE句がINNER JOINと同等の絞り込みとして働いてしまうため,APをもたない社員(資格2がNULLになるべき行)が結果から失われてしまいます。