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

午前U 問14

ある電子商取引サイトでは,会員の属性を柔軟に変更できるように,"会員項目"表で管理することにした。"会員項目"表に対し,次の条件でSQL文を実行して結果を得る場合,SQL文のaに入れる字句はどれか。ここで,実線の下線は主キーを,NULLは値がないことを表す。

〔条件〕
  • 同一"会員番号"をもつ複数の行によって,一人の会員の属性を表す。
  • 新規に追加する行の行番号は,最後に追加された行の行番号に1を加えた値とする。
  • 同一"会員番号"で同一"項目名"の行が複数ある場合,より大きい行番号の項目値を採用する。
14_1.gif/image-size:552×154
14_2.gif/image-size:522×260

分類

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

正解

解説

設問に「より大きい行番号の項目値を採用する」とあるので、なんとなく「MAX」かなと想像できます。

まず、GROUP BY句を用いている場合は、グループ化された列、又は集計関数しかSELECT文に指定できません。DISTINCTは集計関数ではないので誤りとわかります。次に、COUNTは行数を返す関数なので、〔結果表〕の会員名と最終購入年月日が文字列になっていることから誤りと判断できます。
残るMINとMAXですが、MINを採用すると一番内側のSELECT文で会員番号と項目名のグループから、グループごとに最も小さい行番号が取得されてしまうため誤りです。

MAXを指定した場合の動作は次のようになります。
SELECT MAX(行番号) FROM 会員項目
 GROUP BY 会員番号, 項目名
会員項目表を会員番号と項目名でグループ化し、MAX関数で、そのグループごとに最も最も大きい行番号を得ます。これにより、当該会員に係るレコードの行番号(同一項目が複数ある場合はより大きい行番号だけ)のリストが出来上がります。この結果表を①とします。

SELECT 会員番号, 項目名, 項目値 FROM 会員項目
 WHERE 行番号 IN ①
会員項目表から、該当する行番号をもつレコードだけを選択します。この結果表をTとします。

SELECT 会員番号,
 MAX (CASE …) AS 会員名
 MAX (CASE …) AS 最終購入年月日
 FROM T
 GROUP BY 会員番号
 ORDER BY 会員番号
このSELECT文により、会員番号、会員名、最終購入年月日を抽出します。MAX関数を用いているのは、GROUP BY句を使用しているので集計関数しか指定できない、該当するレコードが存在しないときにNULLを表示したいからです。
© 2016-2019 データベーススペシャリストドットコム All Rights Reserved.

Pagetop