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

配下の部署をすべて含める

開発部と、その下にぶら下がるすべての部署に所属する社員を取り出してください。部署の親子関係は busho.parent_busho_id にあります。退職者も含めます。列は「name, salary」の順、社員番号の小さい順に並べてください。

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

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

未確認: IBM Db2

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

  • ⚠️ SQL Server と Oracle では RECURSIVE というキーワードを書きません。WITH だけで書き、自分自身を参照すると再帰になります(Oracle には CONNECT BY という独自の書き方もあります)。
  • 階層構造の「配下すべて」は、再帰で部署の集合を先に作ってから結合します。
  • ⚠️ 階層が何段あるかを SQL の中に書かないでください。段数が増えたときに黙って取りこぼします。
● 起動中…

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

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 段増えた瞬間に取りこぼします。再帰なら深さに関係なくたどり切れます。

組織・カテゴリ・部品構成(BOM)・フォルダなど、親子関係を持つデータでは繰り返し出てくる形です。起点を変えれば任意のノードの配下を取り出せます。

よくある間違い

①再帰せずに 1 段だけ結合する ②たどる向きを逆にして先祖をたどる。

根拠(一次情報)