IPA過去問ドリル

令和3年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問10

テクノロジ/データベース

ある電子商取引サイトでは,会員の属性を柔軟に変更できるように,“会員項目”表で管理することにした。“会員項目”表に対し,次の条件で SQL 文を実行して結果を得る場合,SQL 文の a に入れる字句はどれか。ここで,実線の下線は主キーを,NULL は値がないことを表す。 〔条件〕 (1) 同一“会員番号”をもつ複数の行によって,1 人の会員の属性を表す。 (2) 新規に追加する行の行番号は,最後に追加された行の行番号に 1 を加えた値とする。 (3) 同一“会員番号”で同一“項目名”の行が複数ある場合,より大きい行番号の項目値を採用する。 〔SQL 文〕 SELECT 会員番号, [ a ](CASE WHEN 項目名='会員名' THEN 項目値 END) AS 会員名, [ a ](CASE WHEN 項目名='最終購入年月日' THEN 項目値 END) AS 最終購入年月日 FROM ( SELECT 会員番号, 項目名, 項目値 FROM 会員項目 WHERE 行番号 IN ( SELECT [ a ](行番号) FROM 会員項目 GROUP BY 会員番号, 項目名 ) ) T GROUP BY 会員番号 ORDER BY 会員番号

令和3年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問10の図

出典:令和3年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問10

正解:ウ

解説

条件(3)により,同一“会員番号”・同一“項目名”の行が複数存在する場合は,より大きい行番号(=あとから追加された方)の項目値を採用する必要があります。副問合せでGROUP BY 会員番号, 項目名として各グループの行番号の最大値を選び出し,その行番号に絞り込むことで最新の行だけを残せます。外側の集約でも,各グループには絞り込み後の値が1件しか残らないため,MAXを用いてその値を取り出します。

選択肢ごとの解説

  • 誤り。COUNTは件数を数える関数であり,会員名や最終購入年月日といった項目値そのものを取り出すことができません。
  • 誤り。DISTINCTは集約関数ではなく重複行を除去する修飾子であり,複数行の中から行番号が最大の値を一つ選び出す用途には使えません。
  • 正しい。より大きい行番号を採用するという条件(3)を満たすには,同一会員番号・項目名のグループの中から行番号の最大値を求めるMAXを用いる必要があります。
  • 誤り。MINでは最も小さい(最も古い)行番号,すなわち最初に登録された行が採用されてしまい,「より大きい行番号の項目値を採用する」という条件(3)に反します。
データベーススペシャリストの過去問を演習モードで解く