オリジナル模擬試験3 問27
問27解説へ
"社員"表から,男女それぞれの最年長社員を除くすべての社員を取り出すSQL文とするために,aに入る副問合せはどれか。ここで,"社員"表は次の構造とし,下線部は主キーを表す。
社員(社員番号,社員名,性別,生年月日)
社員(社員番号,社員名,性別,生年月日)
SELECT 社員番号,社員名 FROM 社員 AS S1
WHERE 生年月日 > (a)
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に含まれる社員より生年月日が新しい社員を抽出するSELECT文になっているので、aの副問合せには比較対象の最年長社員の生年月日が返るようになっている必要があります。
- 社員表を性別ごとにグルーピングして男女それぞれの最年長者の生年月日を返すSQL文です。数値比較に対して複数の行を返しているので比較対象として間違っているデータを返していることになります。
- この副問合せでは「生年月日が現在の対象社員よりも古い、または、性別が同じ」という条件に合う社員の中で最も古い生年月日を返します。「男性の最年長社員の生年月日」が「女性の最年長社員の生年月日」よりも新しい場合は副問合せの結果として「女性の最年長社員の生年月日」が返され、「男性の最年長社員」が結果に取り入れられてしまうため誤りです。
- 正しい。S1.性別には現在の対象社員の性別が入っているので、性別が同じである社員の中から最も古い生年月日を比較対象として返せば、男女それぞれの最年長社員以外はWHERE 生年月日>(a)の条件に合致するので正しい結果となります。
- 社員 as S2 というようにエイリアスの指定がないにもかかわらず、突然S2をGROUP BY句で指定しているので文法的に正しくありません。
広告