戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

データベーススペシャリスト 2014年 午前216


問題文

“商品月間販売実績” 表に対して、SQL文を実行して得られる結果はどれか。
データベーススペシャリスト 2014年 午前2 問16の問題画像データベーススペシャリスト 2014年 午前2 問16の選択肢の画像

選択肢

(正解)

🔒 解説は解答すると表示されます

上位N件抽出の相関サブクエリ【午前2解説】

正解の理由

このSQLは各行Aについて、A.総販売数より大きい総販売数を持つ行の個数を数え、その個数が3未満である行を抽出します。つまり「より大きい総販売数を持つ行が2件以下」の商品が選ばれます。表の総販売数を大きい順に見ると、500(S006)、400(S004、S005)、250(S002)、150(S001、S003)、50(S007)であり、総販売数が500または400の行は「より大きいものが2件以下」に該当します。したがって正解は (S004、S005、S006)です。

解法ステップ

  1. 条件文の意味を解釈する:サブクエリは A.総販売数 < B.総販売数 を満たすBの件数をCOUNT(*)で数える。主条件は すなわち「件数 < 3」。
  2. 各行について「自分より大きい総販売数の個数」を数える。
    • S006(500): 大きい行はなし → 件数 = 0 → 0 < 3 → 抽出
    • S004(400): 大きい行はS006のみ → 件数 = 1 → 抽出
    • S005(400): 大きい行はS006のみ → 件数 = 1 → 抽出
    • S002(250): 大きい行はS006,S004,S005 → 件数 = 3 → 3は<3でない → 非抽出
    • S001(150), S003(150): 件数 = 4 → 非抽出
    • S007(50): 件数 = 6 → 非抽出
  3. 抽出結果は S004、S005、S006 の3行で、選択肢では に一致する。

選択肢別の誤答解説

  • ア(S001、S003、S006)
    誤り:S001・S003は総販売数150で、これらより大きい行が4件あるため を満たさない。S004・S005(400)はアに含まれていない点も誤り。
  • イ(S001、S003、S007)
    誤り:S007は総販売数50で、より大きい行は6件あり条件を満たさない。さらに上位のS004/S005/S006が欠落している。
  • ウ(S004、S005、S006)
    正解:説明の通り、各行について「より大きい総販売数の行数」が0〜2であるため抽出される。
  • エ(S004、S005、S007)
    誤り:S007は上で述べたように条件を満たさない。S006(500)が欠けているため不正解。

よくある誤解

  • 「上位3件(順位3位まで)を単純に取り出す」と考える誤り:このSQLは値の大小比較で「上から3位まで」を判定しますが、同値の扱いに注目する必要があります。等しい値は互いに“より大きい”とは見なされないため、同じ値の複数行が含まれることがあります(今回のS004とS005が該当)。
  • サブクエリが非相関だと誤解する:このサブクエリは外側のAを参照しており相関サブクエリです。Aごとに評価されます。

補足コラム

このような「順位付け」や「上位N件の抽出」は、相関サブクエリで実装可能ですが、DBMSが対応していればウィンドウ関数の方が簡潔で効率的です。例えばSQL標準的には以下のように書けます(例示):
  • rank() を使うと同値に同じ順位を与え、dense_rank() は連続した順位をつけます。
  • 上位N(同順位を含める場合)を抽出するには WHERE rank_col <= 3 を使います。
注意点:相関サブクエリはテーブルサイズが大きいと性能が悪化する可能性があるため、インデックスやウィンドウ関数の利用を検討してください。

FAQ

Q. 等しい総販売数が複数あると全て含まれるのか?
A. はい。サブクエリの比較が A.総販売数 < B.総販売数 の「厳密な大なり」なので、等しい行は互いに「より大きい」とは見なされず、上位に含まれることがあります(今回のS004とS005)。
Q. 条件が <= だったら結果は変わるか?
A. もし比較が A.総販売数 <= B.総販売数 なら、等しい行も「より大きいか等しい」とカウントされるため、抽出条件を満たす行は変わります(通常、より少数の行が残る)。
Q. 「上位3件」だが同順位の扱いを含めず厳密に3行だけ欲しい場合は?
A. ウィンドウ関数の ROW_NUMBER() を使って並び順に対して連番を振り、 WHERE rownum <= 3 とする方法が一般的です。

関連キーワード: SQL、相関サブクエリ、上位N抽出、COUNT、ウィンドウ関数、順位付け、パフォーマンス、等値の扱い
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリスト
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について