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』