求oracle自循环树型结构数据的查询

时间:2021-03-12 12:59:36
数据库:oracle
表名:test
字段:
ID  整型,primarkey
CODE   编码
PARENT_ID   整型
说明:这个表是自循环的树形结构存储,CODE是唯一的(根据CODE可以唯一确定一行记录),如果PARENT_ID为0,就表示是树的根节点
数据如下:
ID    CODE    PARENT_ID 
1         a                       0
2         a1                     1
3         a2                     1
4         a11                   2
5         a12                   2
如上数据表示a是根节点,a下有a1和a2 这2个子节点,a1下有a11和a12 这2个子节点
求写一个sql语句,根据指定的CODE,查询出这个CODE所属的整个数结构数据。

9 个解决方案

#1


select * from test
connect by prior id=PARENT_ID
start with PARENT_ID=0
order siblings by id

#2


问题是起始点不好找啊,起始点需要根据一个给定的CODE来查找

#3


start with PARENT_ID=0
这句可以修改为这样
start with code=‘你指定的code’

#4


是这样的,指定一个code,但是我要得到的是这个code所属的从根节点开始的完整的树。

#5


select * from test
connect by prior id=PARENT_ID
start with code=‘code’
--楼主可以用这个connect by循环遍历树,这个prior id = parent_id就是父节点往子节点循环。

#6


告诉怎么改都不行,还得把替换的结果写出来,这年头分真不好拿了
select * from test
connect by prior id=PARENT_ID
start with code='你指定的code'
order siblings by id

#7


可能我没有说清楚,如果start with code=‘指定的code’
这样查询出的结果是指定code这个节点,及其所有子节点数据
但是我要的结果是包含指定code节点的一颗完整的树,
即还要向上找,找到code的父节点、父节点的父节点、直到找到根节点。
ID    CODE    PARENT_ID 
1         a                       0
2         a1                     1
3         a2                     1
4         a11                   2
5         a12                   2
6          a21                   3

举例:制定code为a2,要查找的结果为
ID   CODE    PARENT_ID
1         a                  0
3         a2                1                   
6         a21               3

#8


先反向构建树,查找根节点,在按树形查询
select * from test T
connect by prior id=PARENT_ID
start with PARENT_ID=0
    and  code in (select code from test connect by id=prior PARENT_ID start with code='你指定的code')
order siblings by id

#9


该回复于2014-09-22 08:48:25被管理员删除

#1


select * from test
connect by prior id=PARENT_ID
start with PARENT_ID=0
order siblings by id

#2


问题是起始点不好找啊,起始点需要根据一个给定的CODE来查找

#3


start with PARENT_ID=0
这句可以修改为这样
start with code=‘你指定的code’

#4


是这样的,指定一个code,但是我要得到的是这个code所属的从根节点开始的完整的树。

#5


select * from test
connect by prior id=PARENT_ID
start with code=‘code’
--楼主可以用这个connect by循环遍历树,这个prior id = parent_id就是父节点往子节点循环。

#6


告诉怎么改都不行,还得把替换的结果写出来,这年头分真不好拿了
select * from test
connect by prior id=PARENT_ID
start with code='你指定的code'
order siblings by id

#7


可能我没有说清楚,如果start with code=‘指定的code’
这样查询出的结果是指定code这个节点,及其所有子节点数据
但是我要的结果是包含指定code节点的一颗完整的树,
即还要向上找,找到code的父节点、父节点的父节点、直到找到根节点。
ID    CODE    PARENT_ID 
1         a                       0
2         a1                     1
3         a2                     1
4         a11                   2
5         a12                   2
6          a21                   3

举例:制定code为a2,要查找的结果为
ID   CODE    PARENT_ID
1         a                  0
3         a2                1                   
6         a21               3

#8


先反向构建树,查找根节点,在按树形查询
select * from test T
connect by prior id=PARENT_ID
start with PARENT_ID=0
    and  code in (select code from test connect by id=prior PARENT_ID start with code='你指定的code')
order siblings by id

#9


该回复于2014-09-22 08:48:25被管理员删除