IPA過去問ドリル

平成27年度 春期 データベーススペシャリスト試験 午前Ⅱ 問8

テクノロジ/データベース

“社員取得資格”表に対し,SQL文を実行して結果を得た。SQL文のaに入る字句はどれか。 社員取得資格 社員コード,資格 S001,FE S001,AP S001,DB S002,FE S002,SM S003,FE S004,AP S005,NULL 〔結果〕 社員コード,資格1,資格2 S001,FE,AP S002,FE,NULL S003,FE,NULL (注:本サイトでは原問題の表を文字表記に変換しています) 〔SQL文〕 SELECT C1.社員コード, C1.資格 AS 資格1, C2.資格 AS 資格2 FROM 社員取得資格 C1 LEFT OUTER JOIN 社員取得資格 C2 [ a ]

出典:平成27年度 春期 データベーススペシャリスト試験 午前Ⅱ 問8

正解:ア

解説

求める結果は,資格“FE”をもつ社員それぞれについて,同じ社員が資格“AP”ももっていればその値を,もっていなければNULLを“資格2”として表示するというものである。これを実現するには,社員取得資格をC1(FE側)とC2(AP側)としてLEFT OUTER JOINし,ON句でC1.社員コード=C2.社員コードかつC1.資格='FE'かつC2.資格='AP'という結合条件を指定した上で,外側のWHERE句でC1.資格='FE'の行だけに絞り込む必要がある。こうすることで,FEをもつ社員は必ず1行残り,AP資格がなければC2側の列はNULLになる。

選択肢ごとの解説

  • 正しい。ON句でC1.社員コード=C2.社員コード,C1.資格='FE',C2.資格='AP'という結合条件を指定し,外側のWHERE句でC1.資格='FE'に絞り込むことで,FEをもつ社員ごとに1行だけ表示され,APをもたない社員の資格2はNULLになる。設問の結果と一致する。
  • 誤り。WHERE句がC1.資格 IS NOT NULLとなっており,C1.資格がFE以外(AP,DB,SMなど)の行も残ってしまう。その結果,設問の結果にはない行(例えばS001のAP,NULLやDB,NULLなど)まで出力されてしまう。
  • 誤り。WHERE句がC2.資格='AP'となっているが,LEFT OUTER JOINで一致しなかった行はC2の列がNULLになるため,この条件によってAPをもたない社員(S002,S003など)の行が結果から除外されてしまい,設問の結果と一致しない。
  • 誤り。ON句に資格の条件(C1.資格='FE',C2.資格='AP')を含めず社員コードだけで結合しているため,外部結合の意味が失われ,WHERE句の条件によって実質的に内部結合と同じになり,APをもたない社員(S002,S003)の行が結果から失われてしまう。
データベーススペシャリストの過去問を演習モードで解く