平成20年秋期試験問題 午前問66

"社員"表から,男女それぞれの最年長社員を除くすべての社員を取り出すSQL文とするために,aに入る副問合せはどれか。ここで,"社員"表は次の構造とし,下線部は主キーを表す。

 社員(社員番号,社員名,性別,生年月日)

SELECT 社員番号,社員名 FROM 社員 AS S1
   WHERE 生年月日 > (a)

  • 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.性別
正解 問題へ
分野:テクノロジ系
中分類:データベース
小分類:データ操作
解説
WHERE 生年月日>(a)の条件式は、aより生年月日が大きい(=年齢が若い)社員を抽出するものなので、aには男性であれば男性の最年長社員の生年月日、女性であれば女性の最年長社員の生年月日が結果として返す副問合せが当てはまります。
  • 社員表を性別ごとにグルーピングして男女それぞれの最年長者の生年月日を返すSQL文です。比較対象として副問合せから単一値(1行1列の値)を返す必要があるところ、2つの値を返しているのでエラーとなります。
  • この副問合せでは「生年月日が現在処理中の社員よりも古い、または、性別が同じ」という社員を抽出した後、その中で最も古い生年月日を返します。現在の対象社員の性別にかかわらず最年長社員の生年月日が結果として返るので、男性(女性)の最年長社員が女性(男性)の最年長社員より若い場合、男性(女性)の最年長社員が抽出されます。結果として男女どちらかの最年長社員が取り出されてしまうため誤りです。
  • 正しい。S1.性別は現在処理中の社員の性別なので、性別が同じである社員の中から最も古い生年月日を返せば、男性であれば男性の最年長社員の生年月日、女性であれば女性の最年長社員の生年月日が結果として返ることになります。現在処理中の社員の生年月日が副問合せから返された生年月日より大きければ、その社員は男女ごとの最年長社員ではないことがわかります。男女それぞれの最年長社員以外は主問合せ側のWHERE句が真となるため、正しい結果となります。
  • 社員 as S2 というようにエイリアスの指定がないにもかかわらず、突如S2をGROUP BY句で指定しているので構文エラーとなります。

Pagetop