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


選択肢
ア:
イ:
ウ:(正解)
エ:
🔒 解説は解答すると表示されます
上位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)です。
解法ステップ
- 条件文の意味を解釈する:サブクエリは A.総販売数 < B.総販売数 を満たすBの件数をCOUNT(*)で数える。主条件は すなわち「件数 < 3」。
- 各行について「自分より大きい総販売数の個数」を数える。
- 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 → 非抽出
- 抽出結果は 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)。
A. はい。サブクエリの比較が A.総販売数 < B.総販売数 の「厳密な大なり」なので、等しい行は互いに「より大きい」とは見なされず、上位に含まれることがあります(今回のS004とS005)。
Q. 条件が
A. もし比較が
<= だったら結果は変わるか?A. もし比較が
A.総販売数 <= B.総販売数 なら、等しい行も「より大きいか等しい」とカウントされるため、抽出条件を満たす行は変わります(通常、より少数の行が残る)。Q. 「上位3件」だが同順位の扱いを含めず厳密に3行だけ欲しい場合は?
A. ウィンドウ関数の
A. ウィンドウ関数の
ROW_NUMBER() を使って並び順に対して連番を振り、 WHERE rownum <= 3 とする方法が一般的です。関連キーワード: SQL、相関サブクエリ、上位N抽出、COUNT、ウィンドウ関数、順位付け、パフォーマンス、等値の扱い

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

