平成30年度 春期 データベーススペシャリスト試験 午前Ⅱ 問10
テクノロジ/データベース“社員”表から,男女それぞれの最年長社員を除く全ての社員を取り出すSQL文とするために,aに入れる字句はどれか。ここで,“社員”表の構造は次のとおりであり,実線の下線は主キーを表す。 社員(社員番号,社員名,性別,生年月日) 〔SQL文〕 SELECT 社員番号, 社員名 FROM 社員 AS S1 WHERE 生年月日 > ([ a ])
出典:平成30年度 春期 データベーススペシャリスト試験 午前Ⅱ 問10
- アSELECT MIN(生年月日) FROM 社員 AS S2 GROUP BY S2.性別
- イSELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.生年月日 > S2.生年月日 OR S1.性別 = S2.性別
- ウSELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.性別 = S2.性別
- エSELECT MIN(生年月日) FROM 社員 GROUP BY S2.性別
正解:ウ
解説
求めたいのは,男女それぞれの最年長社員(生年月日が最小=最も古い社員)を除いた全社員です。外側の問合せは「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.性別を参照しており,構文的に不正です。