コマンド道場
再帰 CTE難易度 ★★★★★

上司をさかのぼる

社員番号 13(木村)から始めて、上司をたどれるだけさかのぼり、その経路を取り出してください。本人を階層 1 とし、直属の上司を 2、そのまた上司を 3 …とします。列名は階層が lv で、列は「lv, name」の順、階層の昇順に並べてください。

この書き方が使えない製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite

  • SQL Server では使えませんWITH RECURSIVE(再帰)
  • Oracle Database では使えませんWITH RECURSIVE(再帰)

未確認: IBM Db2

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

  • 再帰の起点(非再帰部分)と、たどる部分(再帰部分)を UNION ALL でつなぎます。
  • ⚠️ SQL Server と Oracle では RECURSIVE というキーワードを書きません。WITH だけで書き、自分自身を参照すると再帰になります。
● 起動中…

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

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

解説

結論

再帰の向きは、再帰部分の結合条件が決めます。

なぜ

起点を 1 行だけ選び、そこから「次にたどる行」を結合で指定します。上司をたどるなら「今の行の joushi_id と一致する shain_id を持つ行」、部下をたどるなら「今の行の shain_id と一致する joushi_id を持つ行」です。左右を入れ替えるだけで意味が正反対になるので、必ず声に出して確かめてください。

上司のいない社員(社長)に到達すると、次にたどる行が無くなり再帰が止まります。データに循環があると止まらなくなるので、深さの上限を持たせることもあります。

よくある間違い

①たどる向きを逆にする ②起点の条件を書き忘れて全行から始まる。

根拠(一次情報)