数据库建立如下:
create table thegroup(
groupid number(10) not null, -- 组ID
groupname varchar2(50) not null, -- 组名
parentid number(10), -- 父组ID
constraint pk_thegroup primary key (groupid)
);
alter table thegroup
add constraint fk_thegroup_01 foreign key (parentid)
references thegroup (groupid)
insert into thegroup (groupid,groupname,parentid) values (1,'总公司',null);
insert into thegroup (groupid,groupname,parentid) values (2,'总部',1);
insert into thegroup (groupid,groupname,parentid) values (3,'行政部',2);
insert into thegroup (groupid,groupname,parentid) values (4,'财务部',2);
insert into thegroup (groupid,groupname,parentid) values (5,'研发部',2);
insert into thegroup (groupid,groupname,parentid) values (6,'上海分公司',1);
insert into thegroup (groupid,groupname,parentid) values (7,'上海分公司行政部',6);
insert into thegroup (groupid,groupname,parentid) values (8,'上海分公司市场部',6);
公司的组织结构是一颗树,现在希望把这颗树取出来,并且要求把同一个节点下的子节点都按照组名排序,即查询出如下结果:
GROUPID GROUPNAME PARENTID
1
总公司
6
上海分公司
1
7
上海分公司行政部 6
8
上海分公司市场部 6
2
总部
1
4
财务部
2
3
行政部
2
5
研发部
2
如上海分公司的名称排在总部之前,因此上海分公司这个子树在总部子树之前,然后上海分公司下2个部门也按照名称排序
现在使用select * from thegroup connect by prior groupid=parentid start with parentid is null可以将整棵树取出,但是没法按名称对子节点排序,请问如何能同时达到这两种效果呢? |