各位,我有个oracle的部门表
表的设计:
ID parentDep childDep ..........
1 部门01 0
2 部门02 0
3 部门01的下属部门03 1 //注释childDep=0表示第一级目录,非0表示子目录,
4 部门01的下属部门03的下属 3 //对应的数字为ID
... 想通过一个select语句或者存储过程,就能找到一个指定部门的所有的下级部门,包含下级部门的下级部门,该如何写呢。
页面显示的话,我知道如果是用treeview控件,可以用递归,但是这我就想出来一个记录集。
表的设计:
ID parentDep childDep ..........
1 部门01 0
2 部门02 0
3 部门01的下属部门03 1 //注释childDep=0表示第一级目录,非0表示子目录,
4 部门01的下属部门03的下属 3 //对应的数字为ID
... 想通过一个select语句或者存储过程,就能找到一个指定部门的所有的下级部门,包含下级部门的下级部门,该如何写呢。
页面显示的话,我知道如果是用treeview控件,可以用递归,但是这我就想出来一个记录集。
我用scott下的emp表做个例子:
SQL> select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10已选择14行。SQL> select connect_by_root empno rootEmp, empno, mgr from emp connect by nocycle prior empno = mgr;
ROOTEMP EMPNO MGR
---------- ---------- ----------
7788 7788 7566
7788 7876 7788
7902 7902 7566
7902 7369 7902
7499 7499 7698
7521 7521 7698
7900 7900 7698
7844 7844 7698
7654 7654 7698
7934 7934 7782
7876 7876 7788
7566 7566 7839
7566 7788 7566
7566 7876 7788
7566 7902 7566
7566 7369 7902
7782 7782 7839
7782 7934 7782
7698 7698 7839
7698 7499 7698
7698 7521 7698
7698 7900 7698
7698 7844 7698
7698 7654 7698
7369 7369 7902
7839 7839
7839 7566 7839
7839 7788 7566
7839 7876 7788
7839 7902 7566
7839 7369 7902
7839 7782 7839
7839 7934 7782
7839 7698 7839
7839 7499 7698
7839 7521 7698
7839 7900 7698
7839 7844 7698
7839 7654 7698已选择39行。
1 A 0 0
2 B 0 0
3 C 2 2\3
4 D 3 2\3\4
.......
先把表多加一列deptIDW,就是部门所属关系的路径
自己写的 GETDEPTIDW 方法,把所有部门路径找出来存上,以后做其他事有很大用处,我们用的是产品装配关系,用这种方法计算投产数量路径我想你写个路径的方法应该没问题的,就是递归调用,获取一个路径,然后存起来,然后查询的时候直接使用.
SQL> select level, sys_connect_by_path(empno,'-') path from emp connect by prior empno = mgr; LEVEL PATH
---------- --------------------------------------------------------------------------------
1 -7788
2 -7788-7876
1 -7902
2 -7902-7369
1 -7499
1 -7521
1 -7900
1 -7844
1 -7654
1 -7934
1 -7876 LEVEL PATH
---------- --------------------------------------------------------------------------------
1 -7566
2 -7566-7788
3 -7566-7788-7876
2 -7566-7902
3 -7566-7902-7369
1 -7782
2 -7782-7934
1 -7698
2 -7698-7499
2 -7698-7521
2 -7698-7900 LEVEL PATH
---------- --------------------------------------------------------------------------------
2 -7698-7844
2 -7698-7654
1 -7369
1 -7839
2 -7839-7566
3 -7839-7566-7788
4 -7839-7566-7788-7876
3 -7839-7566-7902
4 -7839-7566-7902-7369
2 -7839-7782
3 -7839-7782-7934 LEVEL PATH
---------- --------------------------------------------------------------------------------
2 -7839-7698
3 -7839-7698-7499
3 -7839-7698-7521
3 -7839-7698-7900
3 -7839-7698-7844
3 -7839-7698-7654已选择39行。
ID parentDep childDep ..........
1 部门01 0
2 部门02 0
3 部门03 1 //注释childDep=0表示第一级目录,非0表示子目录,
4 部门04 3 //对应的数字为ID 只是为了大家看得清楚,才写这样细
try this:
查询“部门01”的所有下级
select * from tbl start with id='1' connect by prior id=childDep
数据如下:(ORDR为单位序号,NUM1为单位人数,FAR为上级单位序号)
create table AA
(
ORDR int,
NUM1 int,
FAR int
)
insert into AA select '10','0','' from dual;
insert into AA select'1001','5','10' from dual;
insert into AA select'1002','5','10' from dual;
insert into AA select'20','0','' from dual;
insert into AA select'2001','5','20' from dual;
insert into AA select '200101','5','2001' from dual; //展示一级
select t.*
from AA t
where level = 1
start with far is null
connect by prior ORDR = FAR
//展示二级
select t.*
from AA t
where level = 1
or level = 2
start with far is null
connect by prior ORDR = FAR
//展示三级
select t.* from AA t start with far is null connect by prior ORDR = FAR