相関副問合せを用いた男女別最年長社員を除くデータ抽出

正解は「ウ」です。 生年月日において、「最年長社員」とは生年月日が最も古い(値が最小: MIN(生年月日))社員を指します。 設問では「男女それぞれの最年長社員を除く全ての社員」を取り出す必要があるため、外側の行 S1 の性別と同じ性別のグループにおける最小の生年月日を相関副問合せで求め、外側の社員の生年月日がそれよりも大きい(生年月日 > 最小値、つまり最年長者よりも若い)行を抽出します。 SELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.性別 = S2.性別 この副問合せは S1 の性別と一致する社員の集合から最小の生年月日を1行1列(スカラー値)として返すため、WHERE 生年月日 > (...) の比較対象として正しく機能します。したがって、  a  には選択肢ウの字句が入ります。 GROUP BY S2.性別 を指定すると、男女両方のMIN(生年月日)が2行返されるため、スカラー比較演算子「>」の右辺に複数行を渡すことになり実行時エラーとなります(相関副問合せで外側の性別と結合する必要があります)。 WHERE句に S1.生年月日 > S2.生年月日 OR S1.性別 = S2.性別 を指定すると、異性の最年長者であっても生年月日条件に合致して正しくない日付が返されたり、意図した最年長者の特定ができなくなります。 GROUP BY S2.性別 としていますが、FROM句に S2 の別名が指定されておらず構文エラーとなります。またアと同様に複数行が返される問題もあります。

“社員”表から,男女それぞれの最年長社員を除く全ての社員を取り出すSQL文とするために, a に入れる字句はどれか。ここで,“社員”表の構造は次のとおりであり,実線の下線は主キーを表す。

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

〔SQL文〕

sql
SELECT 社員番号, 社員名 FROM 社員 AS S1
WHERE 生年月日 > ( a )
出典平成30年春期 午前Ⅱ
ア
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.性別