平成26年度 春期 データベーススペシャリスト試験 午前Ⅱ 問10
テクノロジ/データベース“社員”表から,男女それぞれの最年長社員を除く全ての社員を取り出すSQL文とするために,aに入る問合せはどれか。ここで,“社員”表の構造は次のとおりであり,下線は主キーを表す。 社員(社員番号,社員名,性別,生年月日) ※社員番号が主キー SELECT 社員番号,社員名 FROM 社員 AS S1 WHERE 生年月日 > [ a ]
出典:平成26年度 春期 データベーススペシャリスト試験 午前Ⅱ 問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.性別)をもつ社員の中での最も古い生年月日(MIN(生年月日),すなわちその性別における最年長者の生年月日)よりも生年月日が後(つまり最年長者本人以外)であるものを取り出せばよい。したがって,副問合せは同じ性別に限定した相関副問合せとし,「WHERE S1.性別 = S2.性別」という条件によってS1の性別に対応するグループ内の最小の生年月日(最年長者の生年月日)を求める必要がある。
選択肢ごとの解説
- ア誤り。GROUP BY S2.性別 とすると,性別ごとの最小生年月日が複数行(男女で2行)返ってしまい,スカラ値を期待するこの比較(生年月日 > 副問合せ)の形では使用できない。相関副問合せとしてS1の性別に対応する1件だけを返す必要がある。
- イ誤り。WHERE句の条件が「S1.生年月日 > S2.生年月日 OR S1.性別 = S2.性別」となっており,OR条件のため性別が異なる社員の生年月日まで含めてMINを求めてしまい,男女それぞれの最年長者を正しく求めることができない。
- ウ正しい。「WHERE S1.性別 = S2.性別」という相関条件によって,S1と同じ性別の社員だけを対象にMIN(生年月日)を求めることができ,これによって性別ごとの最年長者の生年月日が得られる。外側のWHERE句でこれより後の生年月日(最年長者以外)を取り出すことで,男女それぞれの最年長社員を除いた社員を取得できる。
- エ誤り。FROM句が「社員」のみとなっており,AS S2という別名付けがされていないため,GROUP BY句のS2.性別が未定義の参照となり,そもそも構文的に成立しない。