表样例:
id val pid
1 aa /
2 root /
3 cc 1
4 dd 1
5 ee 3
6 ff 2
7 gg 6
val值为root 或pid为‘/’都视为根节点,查询出所有节点对应的根节点呢?查询结果如下所示:
查询结果
id val pid
1 aa /
2 root /
3 cc /
4 dd /
5 ee /
6 ff 2
7 gg 2
------解决思路----------------------
select id,val,connect_by_root(pid) pid
from T
START WITH val='root' or pid='/'
connect by prior id=pid
不过你给的结果是不是有问题,规则不一样
id为1的所有子节点,获取的根节点是id为1这条记录的pid字段
id为2的所有子节点,获取的根节点是id为2这条记录的id字段
不知道是写错了,还是要求就这样,
如果要求是这样的话,把connect_by_root(pid)用decode处理下
改为connect_by_root(decode(……))
------解决思路----------------------
--SQL Server
WITH table1(id,val,pid) AS (
SELECT '1','aa','/' UNION ALL
SELECT '2','root','/' UNION ALL
SELECT '3','cc','1' UNION ALL
SELECT '4','dd','1' UNION ALL
SELECT '5','ee','3' UNION ALL
SELECT '6','ff','2' UNION ALL
SELECT '7','gg','6'
)
,r AS (
SELECT * FROM table1 WHERE val='root' OR pid='/'
UNION ALL
SELECT t.id,t.val,
CASE WHEN r.val='root' THEN t.pid ELSE r.pid END
FROM r
JOIN table1 t
ON r.id = t.pid
)
SELECT * FROM r ORDER BY id
id val pid
---- ---- ----
1 aa /
2 root /
3 cc /
4 dd /
5 ee /
6 ff 2
7 gg 2