现在系统里有一张机构表,结构如下:--创建机构表
create table department (
  dept_id number(10),   --机构编号
  parent_id number(10),  --上级机构编号
  dept_name varchar2(100),  --机构名称
  class number(10)            --机构层级
);
--1级机构(总公司)
insert into department (dept_id,parent_id,dept_name,class) values (1,0,'上海总公司',1);
insert into department (dept_id,parent_id,dept_name,class) values (2,0,'北京总公司',1);--2级机构(分公司)
insert into department (dept_id,parent_id,dept_name,class) values (3,1,'上海浦东分公司',2);
insert into department (dept_id,parent_id,dept_name,class) values (4,1,'上海普陀分公司',2);
insert into department (dept_id,parent_id,dept_name,class) values (5,2,'北京中关村分公司',2);
insert into department (dept_id,parent_id,dept_name,class) values (6,2,'北京海淀区分公司',2);--3级机构(部门)
insert into department (dept_id,parent_id,dept_name,class) values (7,3,'上海浦东分公司销售1部',3);
insert into department (dept_id,parent_id,dept_name,class) values (8,3,'上海浦东分公司销售2部',3);insert into department (dept_id,parent_id,dept_name,class) values (9,4,'上海普陀分公司销售1部',3);
insert into department (dept_id,parent_id,dept_name,class) values (10,4,'上海普陀分公司销售2部',3);insert into department (dept_id,parent_id,dept_name,class) values (11,5,'北京中关村分公司销售1部',3);
insert into department (dept_id,parent_id,dept_name,class) values (12,5,'北京中关村分公司销售2部',3);insert into department (dept_id,parent_id,dept_name,class) values (13,6,'北京海淀区分公司销售1部',3);
insert into department (dept_id,parent_id,dept_name,class) values (14,6,'北京海淀区分公司销售2部',3);
commit;另外还有一张用户表,结构如下:--创建用户表
create table usrtbl (
  user_id number(10),
  dept_id number(10),
  user_name varchar2(10)
);insert into usrtbl (user_id,dept_id,user_name) values (1,3,'陈志强');
commit;
现要求查询出用户所属父机构、当前机构及其所有下属机构,比如用户在第2个层级,那么他只能看到他的上级机构、当前机构和下属所有机构,没有权限看到同级的其他机构。--查询机构表
select d.dept_id,lpad('-',level*2,'--')||d.dept_name as dept_name from department d
start with d.parent_id = 0
connect by prior d.dept_id = d.parent_id;各位有没有好办法,提供一个能实现该需求的SQL。递归子查询

解决方案 »

  1.   

    sql分为两类,一个是查询上级的sql,一个查询下级的sql。用循环去查询。
    查询上级/下级的sql不用我说吧,你应该能写出来。
      

  2.   

    ChenZw> SELECT DISTINCT D.DEPT_ID,LPAD('-',LEVEL*2,'--')||D.DEPT_NAME AS DEPT_NAME FROM DEPARTMENT D,USRTBL A
      2  START WITH D.PARENT_ID = 3
      3  CONNECT BY  D.DEPT_ID = PRIOR D.PARENT_ID
      4  ORDER BY 1
      5  /   DEPT_ID DEPT_NAME
    ---------- ------------------------------
             1 ------上海总公司
             3 ----上海浦东分公司
             7 --上海浦东分公司销售1部
             8 --上海浦东分公司销售2部已选择4行。已用时间:  00: 00: 00.03
      

  3.   

    那就使用UNION吧..按照3 向上递归  + 按照3 向下递归xxxx
    START WITH D.PARENT_ID = 3
    CONNECT BY  D.DEPT_ID = PRIOR D.PARENT_ID
    UNION
    xxxx
    START WITH D.PARENT_ID = 3
    CONNECT BY  PRIOR D.DEPT_ID = D.PARENT_ID 
      

  4.   

    select d.dept_id,d.dept_name as dept_name from department d    where dept_id=(select parent_id from department where dept_id=3) 
    union all
      select d.dept_id,lpad(' ',level*2,'  ')||d.dept_name as dept_name from department d
    start with d.dept_id =3
    connect by prior d.dept_id = d.parent_id ;