专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Oracle管理

sql递归查询话语,查询出根节点对应的所有子节点

发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
sql递归查询语句,查询出根节点对应的所有子节点
表样例:
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
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: