直接看效果
WITH TR_TREE(id, parent_id, path)
AS (
-- 文件目录 /var/lib/nginx
SELECT 1, null, 'var' from dual union all
SELECT 2, 1, 'lib' from dual union all
SELECT 3, 2, 'ngix' from dual
)
select
SYS_CONNECT_BY_PATH(T.path, '/') TR_PATH,
LEVEL DEPTH,
T.id, T.parent_id, T.path
from
TR_TREE T
connect by
-- 从当前节点到子节点
prior T.ID = T.PARENT_ID
-- 从当前节点到根节点
-- T.ID = prior T.PARENT_ID
start with
-- 当前节点
T.path = 'lib'
order siblings by
path desc
结果:
1. 从当前节点到子节点
2. 从当前节点到根节点
注意到SQL里prior放在不同的列里,tr_path的方向就变了。
prior是在oracle里是一个一元运算符(和加减号是一个优先级别的,可以瞬间识别出来)