相関副問合せによる男女別最年長社員以外の抽出

「男女それぞれの最年長社員」とは、生年月日が最も古い(MIN(生年月日) の値をもつ)社員のことです。 主問合せで評価している行 S1 の性別と同じ性別グループにおける最小の生年月日を副問合せで求め、`S1.生年月日 > (その性別の最年長生年月日)` を満たす行を抽出すれば、男女それぞれの最年長社員を除いた社員を取り出すことができます。 副問合せ内で主問合せの性別と一致させる条件は: `WHERE S1.性別 = S2.性別` となります。 これにより、副問合せ全体は: `SELECT MIN(生年月日) FROM 社員 AS S2 WHERE S1.性別 = S2.性別` となり、性別ごとの最年長生年月日(スカラ値1件)が返され、主問合せの比較演算子 `>` と正常に比較されます。 したがって、ウ が正解です。 GROUP BY S2.性別 を使用すると、男女2行の集計結果が返されるため、主問合せの比較演算子 `>`(単一値比較)で実行時エラー(単一行副問合せが複数行を返したエラー)が発生します。 WHERE 句に `S1.生年月日 > S2.生年月日` を含めると自分より若い社員との不要な条件結合となり、性別ごとの最小生年月日が正しく取得できません。 FROM 句に別名 S2 が定義されていないため `GROUP BY S2.性別` は構文エラーとなり、また GROUP BY により複数行が返される点も誤りです。

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

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

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

出典2022r04a_db_am2_問12
ア
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.性別