3. order siblings by
siblingsというのは英語で、兄弟という意味です。order siblings byとすると、木の階層を崩さずにソートできます。サンプルを見てみましょう。
| ID | OyaID |
| 1 | null |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 5 | 3 |
| 6 | 3 |
| 7 | 4 |
| 8 | 4 |
| 9 | 6 |
| 10 | 7 |
| 20 | null |
| 21 | 20 |
| 22 | 20 |
| 23 | 21 |
| 24 | 21 |
select connect_by_root ID as treeID, ID,OyaID,Level, sys_connect_by_path(to_char(ID),',') as path from siblingsT start with OyaID is null connect by prior ID = OyaID order siblings by ID desc;
| treeID | ID | OyaID | Level | path |
| 20 | 20 | null | 1 | ,20 |
| 20 | 22 | 20 | 2 | ,20,22 |
| 20 | 21 | 20 | 2 | ,20,21 |
| 20 | 24 | 21 | 3 | ,20,21,24 |
| 20 | 23 | 21 | 3 | ,20,21,23 |
| 1 | 1 | null | 1 | ,1 |
| 1 | 4 | 1 | 2 | ,1,4 |
| 1 | 8 | 4 | 3 | ,1,4,8 |
| 1 | 7 | 4 | 3 | ,1,4,7 |
| 1 | 10 | 7 | 4 | ,1,4,7,10 |
| 1 | 3 | 1 | 2 | ,1,3 |
| 1 | 6 | 3 | 3 | ,1,3,6 |
| 1 | 9 | 6 | 4 | ,1,3,6,9 |
| 1 | 5 | 3 | 3 | ,1,3,5 |
| 1 | 2 | 1 | 2 | ,1,2 |
SQLのイメージは、下記となります。木ごとに区切る赤線をイメージしてます。

order siblings by ID descを指定してますので、下記のような処理をイメージしてます。
start with句の条件を満たす根を選ぶ段階で、IDの大きいほうから選ばれる。根からの、深さ優先探索でも、子供が複数あったらIDの大きいほうから選ばれる。そして、深さ優先探索の行きがけ順で行を返す。
最後に
今回は、Level擬似列、sys_connect_by_path関数、order siblings byを扱いました。次回は、connect_by_IsLeaf、connect_by_root、priorを扱います。
参考資料
- Oracle Database SQLリファレンス 10g リリース2 階層問合せ
- Oracle Database SQL Reference 10g Release2 Hierarchical Queries
Oracleの公式マニュアルの階層問い合わせに関する部分です(日本語)。
Oracleの公式マニュアルの階層問い合わせに関する部分です(英語)。
