再帰 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_id | busho_name | parent_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_id | name | busho_id | joushi_id | salary | hired_on | taishoku_on |
|---|---|---|---|---|---|---|
| 1 | 鈴木 | 1 | NULL | 980000 | 2014-04-01 | NULL |
| 2 | 佐藤 | 2 | 1 | 720000 | 2016-10-01 | NULL |
| 3 | 田中 | 2 | 2 | 520000 | 2019-04-01 | NULL |
| 4 | 中村 | 2 | 2 | 530000 | 2020-04-01 | NULL |
| 5 | 小林 | 2 | 2 | 445050 | 2024-04-01 | NULL |
解説
結論
再帰の向きは、再帰部分の結合条件が決めます。
なぜ
起点を 1 行だけ選び、そこから「次にたどる行」を結合で指定します。上司をたどるなら「今の行の joushi_id と一致する shain_id を持つ行」、部下をたどるなら「今の行の shain_id と一致する joushi_id を持つ行」です。左右を入れ替えるだけで意味が正反対になるので、必ず声に出して確かめてください。
上司のいない社員(社長)に到達すると、次にたどる行が無くなり再帰が止まります。データに循環があると止まらなくなるので、深さの上限を持たせることもあります。
よくある間違い
①たどる向きを逆にする ②起点の条件を書き忘れて全行から始まる。
根拠(一次情報)
- PostgreSQL 18 マニュアル: WITH 問い合わせ(共通テーブル式)一次情報・確認 2026-08-01