データベーススペシャリスト 平成30年春期 午前U 問10

午前U 問10

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

社員(社員番号,社員名,性別,生年月日)
10.gif/image-size:271×56
  • [この問題の出題歴]
  • データベース H19春期 問35
  • データベース H23特別 問11
  • データベース H26春期 問10

分類

テクノロジ系 » データベース » データ操作

正解

解説

WHERE句では副問合せの結果よりも生年月日が大きい(年齢が若い社員の)行を抽出対象としているため、主問合せの行の性別の値に応じて男性又は女性の(a)は最年長社員の生年月日が返るようになっている必要があります。ここでは以下の表を使用して正しい結果が得られるかを選択肢ごとに検証していきます。
10_1.gif/image-size:247×155
  • "社員"表を性別ごとにグルーピングして男女それぞれの最年長者の生年月日を返すSQL文です。結果セットが複数行になるため">"で比較するデータとしては不適切です。
    10_2.gif/image-size:453×173
    ※もし複数の要素の「いずれかの値よりも大きい」や「全ての値よりも大きい」という条件を指定する場合は比較演算子に続けて「SOME」や「ALL」のキーワードを指定します。
  • 副問合せの中で主問合せのS1の値を使用するため相関副問合せになります。
    まず、
    WHERE S1.生年月日 > S2.生年月日
    OR S1.性別 = S2.性別
    の部分で主問合せの行ごとに「その行の生年月日より小さい」又は「性別が同じ」という条件を満たすS2(社員表)の行が抽出され、その中で最も小さい生年月日の値が返されます。具体的に社員表の1,2行目に対する副問合せは以下の結果を返します。
    10_3.gif/image-size:527×458
    この副問合せの結果は常に男女問わず最小の生年月日になるため不適切です。
  • 正しい。副問合せの中で主問合せのS1の値を使用するため相関副問合せになります。
    主問合せの行ごとに性別の値が等しいS2(社員表)の行が抽出され、その中で最も小さい生年月日の値が返されます。具体的に社員表の1,2行目に対する副問合せは以下の結果を返します。
    10_4.gif/image-size:527×422
    以上の手順で主問合せ側の行の性別の値に応じて、副問合せはその性別の最も小さい生年月日を返します。後は主問合せのWHERE句で返された値よりも大きい生年月日をもつ行のみを抽出すれば、男女それぞれの最年長社員を除く全ての社員からなる結果セットが得られます。
  • 社員 AS S2 というようにエイリアスの指定がないにもかかわらず、突然GROUP BY句でS2を使用しているので構文的に正しくありません。
© 2016-2018 データベーススペシャリストドットコム All Rights Reserved.

Pagetop