免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3220 | 回复: 5
打印 上一主题 下一主题

请教一个较难的sql的写法,类似于部门树,但一个部门可能有多个上级部门,请帮忙 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-11 21:10 |只看该作者 |倒序浏览
本帖最后由 dream_land 于 2010-11-11 21:59 编辑

类似于以下数据:
  1. SQL> select * from test order by no;

  2. NO         PARENT_NO            MANAGER_ID NAME
  3. ---------- -------------------- ---------- --------------------
  4. 099                                      1 最高级部门
  5. 100        099                           2 1部门1
  6. 101        099                           8 1部门2
  7. 102        099                           5 1部门3
  8. 201        100                           3 2部门1
  9. 301        201                           4 3部门1
  10. 302        201                          10 3部门2
  11. 401        301                           6 4部门1
  12. 402        302                           7 4部门2
  13. 403        302                           9 4部门3
  14. 501        401,402                      11 多个上级部门1
  15. 502        401                          13 一个上级部门
  16. 503        401,402,403                  12 多个上级部门2
复制代码
no字段代表一个部门,parent_no是上级部门no,多个上级部门以逗号隔开,manager_id相当于部门负责人id,name是部门名称,现在不要再说表结构设计方面的问题。只考虑把各个部门和负责人id的映射关系查出来做成一个视图,上级部门的负责人id可以对应到他所在的部门以及所有下级部门

我想到的视图查询语句如下:

  1. SELECT distinct manager_id,
  2.        FIRST_VALUE (name) OVER (PARTITION BY part ORDER BY lv) name,
  3.        FIRST_VALUE (no) OVER (PARTITION BY part ORDER BY lv) no
  4.   FROM (SELECT     LEVEL lv, ROWNUM - LEVEL part, a.*
  5.               FROM test a
  6.         CONNECT BY INSTR (PRIOR a.parent_no, a.no) > 0) b;

复制代码
这个结果不正确,究其原因,就是利用ROWNUM - LEVEL作为分组,不能把一个部门的所有上级作为一个分组。

不知道把问题说清楚没有,请各位帮我看看这个sql该怎么写,多谢!!

附建表语句和数据插入sql:

  1. CREATE TABLE TEST
  2. (
  3.   NO          VARCHAR2(10 BYTE),
  4.   PARENT_NO   VARCHAR2(100 BYTE),
  5.   MANAGER_ID  NUMBER,
  6.   NAME        VARCHAR2(50 BYTE)
  7. );


  8. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  9. '302', '201', 10, '3部门2');
  10. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  11. '501', '401,402', 11, '多个上级部门1');
  12. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  13. '502', '401', 13, '一个上级部门');
  14. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  15. '503', '401,402,403', 12, '多个上级部门2');
  16. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  17. '099', NULL, 1, '最高级部门');
  18. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  19. '100', '099', 2, '1部门1');
  20. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  21. '201', '100', 3, '2部门1');
  22. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  23. '301', '201', 4, '3部门1');
  24. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  25. '102', '099', 5, '1部门3');
  26. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  27. '401', '301', 6, '4部门1');
  28. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  29. '402', '302', 7, '4部门2');
  30. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  31. '101', '099', 8, '1部门2');
  32. INSERT INTO TEST ( NO, PARENT_NO, MANAGER_ID, NAME ) VALUES (
  33. '403', '302', 9, '4部门3');
  34. COMMIT;

复制代码

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2010-11-11 22:57 |只看该作者
这个好像可以实现。明天帮你看看。

论坛徽章:
3
CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43
3 [报告]
发表于 2010-11-12 08:08 |只看该作者
有时候所得结果不太好描述时,建议文字+结果的方式给大家提供

比如你想要达到的效果,贴出,这样比较明确,文字有时候不太好理解

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
4 [报告]
发表于 2010-11-12 10:16 |只看该作者
select a.no as no,b.no as parent_no,a.manager_id manage_id,a.name name
from test a,test b
where b.no(+) = a.parent_no
order by a.no


这个关于多级部门的还没有取出来。等等 。

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
5 [报告]
发表于 2010-11-12 10:39 |只看该作者
  1. column parent_no format A15;
  2. column name format A30;
  3. select distinct a.no as no,a.parent_no as parent_no ,a.manager_id manage_id,a.name name
  4. from test a,test b
  5. where instr(a.parent_no,b.no) > 0
  6.      or a.parent_no is null
  7. order by a.no;
复制代码
这个应该可以得到你的结果。

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
6 [报告]
发表于 2010-11-12 10:41 |只看该作者


这是运行结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP