2. connect_by_IsCycle疑似列
前問より複雑な有向グラフで、connect_by_IsCycle疑似列を使ったサンプルです。
| ID | NextID1 | NextID2 |
| 1 | 2 | 3 |
| 2 | 4 | 5 |
| 3 | 4 | null |
| 4 | 2 | 6 |
| 5 | 6 | null |
| 6 | null | null |
(親の行の)NextID1 = (子の行の)ID または、(親の行の)NextID2 = (子の行の)ID を親子条件として、(同じノードへ再訪問しない)各ノードまでの経路を列挙してみます。
select ID,Level,sys_connect_by_path(to_char(ID),'-') as path, connect_by_IsCycle as IsCycle from RosenMap2 start with ID = 1 connect by nocycle ID in(prior NextID1,prior NextID2) order by ID,path;
| ID | Level | path | IsCycle |
| 1 | 1 | -1 | 0 |
| 2 | 2 | -1-2 | 0 |
| 2 | 4 | -1-3-4-2 | 1 |
| 3 | 2 | -1-3 | 0 |
| 4 | 3 | -1-2-4 | 1 |
| 4 | 3 | -1-3-4 | 0 |
| 5 | 3 | -1-2-5 | 0 |
| 5 | 5 | -1-3-4-2-5 | 0 |
| 6 | 4 | -1-2-4-6 | 0 |
| 6 | 4 | -1-2-5-6 | 0 |
| 6 | 6 | -1-3-4-2-5-6 | 0 |
| 6 | 4 | -1-3-4-6 | 0 |
上記の結果から、connect_by_IsCycle疑似列は、経路上で訪問済であるノードを子供に持てば1、そうでなければ0となることが確認できます。下記のような有向グラフの絵を描いてみると、分かりやすいでしょう。

最後に
今回は、connect by nocycle、connect_by_IsCycle擬似列を扱いました。次回からは、階層問い合わせの使用例を、紹介していきます。
参考資料
- 『Oracle Database SQLリファレンス 10g リリース2 階層問合せ』
- 『Oracle Database SQL Reference 10g Release2 Hierarchical Queries』
