- 论坛徽章:
- 0
|
本帖最后由 dream_land 于 2010-11-11 21:59 编辑
类似于以下数据:- SQL> select * from test order by no;
- NO PARENT_NO MANAGER_ID NAME
- ---------- -------------------- ---------- --------------------
- 099 1 最高级部门
- 100 099 2 1部门1
- 101 099 8 1部门2
- 102 099 5 1部门3
- 201 100 3 2部门1
- 301 201 4 3部门1
- 302 201 10 3部门2
- 401 301 6 4部门1
- 402 302 7 4部门2
- 403 302 9 4部门3
- 501 401,402 11 多个上级部门1
- 502 401 13 一个上级部门
- 503 401,402,403 12 多个上级部门2
复制代码 no字段代表一个部门,parent_no是上级部门no,多个上级部门以逗号隔开,manager_id相当于部门负责人id,name是部门名称,现在不要再说表结构设计方面的问题。只考虑把各个部门和负责人id的映射关系查出来做成一个视图,上级部门的负责人id可以对应到他所在的部门以及所有下级部门。
我想到的视图查询语句如下:
- SELECT distinct manager_id,
- FIRST_VALUE (name) OVER (PARTITION BY part ORDER BY lv) name,
- FIRST_VALUE (no) OVER (PARTITION BY part ORDER BY lv) no
- FROM (SELECT LEVEL lv, ROWNUM - LEVEL part, a.*
- FROM test a
- CONNECT BY INSTR (PRIOR a.parent_no, a.no) > 0) b;
复制代码 这个结果不正确,究其原因,就是利用ROWNUM - LEVEL作为分组,不能把一个部门的所有上级作为一个分组。
不知道把问题说清楚没有,请各位帮我看看这个sql该怎么写,多谢!!
附建表语句和数据插入sql:
- CREATE TABLE TEST
- (
- NO VARCHAR2(10 BYTE),
- PARENT_NO VARCHAR2(100 BYTE),
- MANAGER_ID NUMBER,
- NAME VARCHAR2(50 BYTE)
- );
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '302', '201', 10, '3部门2');
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '501', '401,402', 11, '多个上级部门1');
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '502', '401', 13, '一个上级部门');
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '503', '401,402,403', 12, '多个上级部门2');
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '099', NULL, 1, '最高级部门');
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '100', '099', 2, '1部门1');
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '201', '100', 3, '2部门1');
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '301', '201', 4, '3部门1');
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '102', '099', 5, '1部门3');
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '401', '301', 6, '4部门1');
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '402', '302', 7, '4部门2');
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '101', '099', 8, '1部门2');
- INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
- '403', '302', 9, '4部门3');
- COMMIT;
复制代码 |
|