コマンド道場
相関副問い合わせ難易度 ★★★★

自分より上の人数を数える

部署に所属している社員それぞれについて、「同じ部署で自分より給与が高い社員の人数」を取り出してください。列名は人数が ue で、列は「name, salary, ue」の順、shain_id の小さい順に並べてください。

主要 7 製品で通用 そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database / IBM Db2

製品ごとの対応表(実測)を見る

  • SELECT の中に相関副問い合わせを書くと、行ごとに計算した値を列として並べられます。
  • これは順位づけと同じ考え方です。ウィンドウ関数の rank() を使えば 1 回の走査で求められます。
● 起動中…

この問題で使えるテーブル(名前をタップすると入力できます)

7

NULL
🔑int不可
text不可
int
データを見る(先頭 5 行)
busho_idbusho_nameparent_busho_id
1経営NULL
2開発1
3営業1
4管理1
5基盤2

18

NULL
🔑int不可
text不可
int
int
numeric(10,0)不可
date不可
date
データを見る(先頭 5 行)
shain_idnamebusho_idjoushi_idsalaryhired_ontaishoku_on
1鈴木1NULL9800002014-04-01NULL
2佐藤217200002016-10-01NULL
3田中225200002019-04-01NULL
4中村225300002020-04-01NULL
5小林224450502024-04-01NULL

解説

結論

SELECT の中の相関副問い合わせは、行ごとに計算した値を列にできます。

なぜ

副問い合わせが外側の行を参照しているため、行が変わるたびに条件も変わり、別の値が計算されます。ここでは「同じ部署」「自分より高い」という 2 つの条件がどちらも外側に依存しています。

比較を > から >= に変えると自分自身が数に入り、全員の値が 1 増えます。境界の扱いが結果を静かに変える典型例です。

この計算は順位づけそのものです。ウィンドウ関数の rank() なら 1 回の走査で求まるので、行数が多いときはそちらを検討してください。

よくある間違い

①外側への参照を 1 つ落として母集団がずれる ②> と >= を取り違えて自分を数える。

根拠(一次情報)