IPA過去問ドリル

令和2年度 10月 データベーススペシャリスト試験 午前Ⅱ 問10

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

“社員”表から,男女それぞれの最年長社員を除く全ての社員を取り出すSQL文とするために,aに入れる字句はどれか。ここで,“社員”表の構造は次のとおりであり,実線の下線は主キーを表す。 社員(社員番号,社員名,性別,生年月日) 〔SQL文〕 SELECT 社員番号, 社員名 FROM 社員 AS S1 WHERE 生年月日 > ([ a ])

出典:令和2年度 10月 データベーススペシャリスト試験 午前Ⅱ 問10

正解:ウ

解説

求めたいのは,男女それぞれの最年長社員(生年月日が最小=最も古い社員)を除いた全社員です。外側の問合せは「S1.生年月日が,あるサブクエリの結果より後である(=最年長ではない)」という条件で社員を絞り込みます。サブクエリでは,S1と同じ性別の社員の中での最小の生年月日(最年長者の生年月日)を求める必要があるため,社員S2をS1.性別=S2.性別で相関させてMIN(生年月日)を求めるウの記述が正しくなります。アはGROUP BY S2.性別によって性別ごとに複数行のMIN(生年月日)を返してしまい,スカラ値を要求する比較(生年月日 > (サブクエリ))には使えません。イはOR条件によってS1と異なる性別の社員も含めてMINを取ってしまい,性別ごとに最年長者の生年月日を正しく求められません。エはFROM句で別名を付けていない“社員”に対してS2.性別という定義されていないエイリアスを参照しており,構文として成立しません。

選択肢ごとの解説

  • 誤り。GROUP BY S2.性別によって性別ごとの最小生年月日が複数行返ってくるため,単一の値を期待する比較演算子「>」の右辺としては使用できず,意図通りに動作しません。
  • 誤り。S1.性別=S2.性別に加えてOR条件でS1.生年月日 > S2.生年月日も真になるケースを含めてしまうため,性別ごとに正しく最年長者の生年月日を求めることができません。
  • 正しい。S1と同じ性別の社員(S2)に絞り込んだ上でMIN(生年月日)を求める相関副問合せとなっており,各社員S1についてその性別における最年長者の生年月日と比較することで,男女それぞれの最年長社員だけを除外できます。
  • 誤り。FROM句が「社員」のみでエイリアスS2が定義されていないにもかかわらず,GROUP BY句でS2.性別を参照しており,構文的に不正です。
データベーススペシャリストの過去問を演習モードで解く