请教如何遍历一个树的问题

zoouii 2007-07-02 09:39:20
表结构是这样的:

deptid 部门编号
deptname 部门名称
order 排序用的序号
fatherid 上级部门编号

其中有一个fatherid为0的根节点。

要求查询结果按照树的上下顺序排列,每个部门下面是它的子部门,同级别的部门按照order排序。

根部门
一级部门1
一级部门1的子部门1
一级部门1的子部门1的子部门1
一级部门1的子部门2
一级部门2
一级部门2的子部门1



...全文
555 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainv 2007-07-03
  • 打赏
  • 举报
回复
mark
zoouii 2007-07-02
  • 打赏
  • 举报
回复
1980czd(川中岛) :

OK了,多谢。结贴。
1980czd 2007-07-02
  • 打赏
  • 举报
回复
select lpad(' ',level,' ')||a.deptname from (select * from table_name oder by fatherid,order) a
start with deptid=4
connect by fatherid =prior deptid

再试一下
zoouii 2007-07-02
  • 打赏
  • 举报
回复
1980czd(川中岛):

还是不行,要求在同一级别中,按照order字段来排序,即如果有三个一级部门的order是1、3、5,那么3和5在1的后面,如果1又有3个子部门order是1、2、3,则这三个子部门要按1、2、3排列在一级部门1的后面并在后两个一级部门前面。
1980czd 2007-07-02
  • 打赏
  • 举报
回复
select lpad(' ',level,' ')||a.deptname from (select * from table_name oder by deptid ) a
start with deptid=4
connect by fatherid =prior deptid

看下这样行不
xiaoxiao1984 2007-07-02
  • 打赏
  • 举报
回复
SQL> select * from tts;

DEPTID DEPTNAME order FATHERID
-------------------- -------------------- -------------------- --------------------
1 根部门 0
101 一级部门1 0
102 一级部门2 0
10101 子部门1 101
10102 子部门2 101
10201 子部门1 102
10202 子部门2 102
10203 子部门3 102

8 rows selected

SQL>
SQL> select deptid, Ltrim(SYS_CONNECT_BY_PATH (deptname, '的'), '的') from tts
2 connect by prior deptid = fatherid
3 start with fatherid = '0'
4 /

DEPTID LTRIM(SYS_CONNECT_BY_PATH(DEPT
-------------------- --------------------------------------------------------------------------------
1 根部门
101 一级部门1
10101 一级部门1的子部门1
10102 一级部门1的子部门2
102 一级部门2
10201 一级部门2的子部门1
10202 一级部门2的子部门2
10203 一级部门2的子部门3

8 rows selected
zoouii 2007-07-02
  • 打赏
  • 举报
回复
1980czd(川中岛):
用你的方法可以满足每个部门下面跟着它的子部门,但是没有满足同级部门按照order排序。

TodayZ(天山浪子):
你的方法不错我正在试。
TodayZ 2007-07-02
  • 打赏
  • 举报
回复
比较简单的方法是创建一个函数,输入参数是该表的主键或唯一键,输出是该记录的完整的部门编号(包括该部门的所有的上级部门编号),举例:0-001-002-001 就是该公司一级部门1的子部门2的子部门1,然后在按照这个函数的值作为伪码进行排序。这个函数还有用于查询该部门下的所有下属部门的功能。
1980czd 2007-07-02
  • 打赏
  • 举报
回复
select lpad(' ',level,' ')||a.deptname from table_name a
start with deptid=4
connect by fatherid =prior deptid

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧