ITPUB论坛-中国专业的IT技术社区

 找回密码
 注册
查看: 434|回复: 9

[SQL] 员工的上级问题

[复制链接]
认证徽章
论坛徽章:
168
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB社区12周年站庆徽章
日期:2013-08-13 16:52:38itpub13周年纪念徽章
日期:2014-10-08 15:21:35ITPUB14周年纪念章
日期:2015-10-26 17:23:44ITPUB15周年纪念
日期:2018-02-09 14:12:58状元
日期:2015-11-19 12:58:23榜眼
日期:2015-11-19 12:58:23探花
日期:2015-11-19 12:58:23进士
日期:2015-11-19 12:59:09
跳转到指定楼层
1#
发表于 2018-7-5 10:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

有如下一张表:

如何用SQL查出销售人员(Sales)的总监(Dr)是谁?
注意:员工到总监的层级不固定。

with temp as
(
select 1 as id, 'AAA' as name , null as pid, 'Dr' as title from dual
union all
select 2 as id, 'BBB' as name , null as pid, 'Dr' as title from dual
union all
select 3 as id, 'CCC' as name , 1 as pid, 'Mgr' as title from dual
union all
select 4 as id, 'DDD' as name , 2 as pid, 'Mgr' as title from dual
union all
select 5 as id, 'EEE' as name , 1 as pid, 'Sales' as title from dual
union all
select 6 as id, 'FFF' as name , 3 as pid, 'Sales' as title from dual
union all
select 7 as id, 'GGG' as name , 4 as pid, 'Sales' as title from dual
)
select * from temp;

论坛徽章:
11
2012新春纪念徽章
日期:2012-01-04 11:56:19技术图书徽章
日期:2017-11-10 14:15:52罗罗诺亚·索隆
日期:2017-08-30 13:50:35马上有钱
日期:2015-02-09 13:21:28优秀写手
日期:2014-12-24 06:00:14蛋疼蛋
日期:2014-12-01 15:24:16比亚迪
日期:2013-09-02 15:14:362013年新春福章
日期:2013-02-25 14:51:24蛋疼蛋
日期:2012-11-18 10:54:53ITPUB 11周年纪念徽章
日期:2012-10-10 13:11:14
2#
发表于 2018-7-5 11:19 | 只看该作者
如果总监是最顶级可以如下
WITH temp AS
(SELECT 1 AS id,
         'AAA' AS NAME,
         NULL AS pid,
         'Dr' AS title
    FROM dual
  UNION ALL
  SELECT 2 AS id,
         'BBB' AS NAME,
         NULL AS pid,
         'Dr' AS title
    FROM dual
  UNION ALL
  SELECT 3 AS id,
         'CCC' AS NAME,
         1 AS pid,
         'Mgr' AS title
    FROM dual
  UNION ALL
  SELECT 4 AS id,
         'DDD' AS NAME,
         2 AS pid,
         'Mgr' AS title
    FROM dual
  UNION ALL
  SELECT 5 AS id,
         'EEE' AS NAME,
         1 AS pid,
         'Sales' AS title
    FROM dual
  UNION ALL
  SELECT 6 AS id,
         'FFF' AS NAME,
         3 AS pid,
         'Sales' AS title
    FROM dual
  UNION ALL
  SELECT 7 AS id,
         'GGG' AS NAME,
         4 AS pid,
         'Sales' AS title
    FROM dual)
SELECT t.*
  FROM temp t
WHERE connect_by_isleaf = 1
CONNECT BY PRIOR t. pid = t.id
START WITH t.id=7

使用道具 举报

回复
认证徽章
论坛徽章:
168
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB社区12周年站庆徽章
日期:2013-08-13 16:52:38itpub13周年纪念徽章
日期:2014-10-08 15:21:35ITPUB14周年纪念章
日期:2015-10-26 17:23:44ITPUB15周年纪念
日期:2018-02-09 14:12:58状元
日期:2015-11-19 12:58:23榜眼
日期:2015-11-19 12:58:23探花
日期:2015-11-19 12:58:23进士
日期:2015-11-19 12:59:09
3#
发表于 2018-7-5 11:22 | 只看该作者
总监不是最顶层

使用道具 举报

回复
论坛徽章:
9
2013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-02-28 17:57:18蜘蛛蛋
日期:2013-03-06 17:16:15茶鸡蛋
日期:2013-03-26 17:32:46雪佛兰
日期:2013-11-26 10:47:53优秀写手
日期:2014-01-22 06:00:12马上有车
日期:2014-04-16 17:19:19慢羊羊
日期:2015-03-04 14:53:332015年新春福章
日期:2015-03-06 11:58:39
4#
发表于 2018-7-5 11:59 | 只看该作者
本帖最后由 lhqmccn 于 2018-7-5 12:11 编辑

WITH temp AS
(SELECT 1 AS id, 'AAA' AS NAME, NULL AS pid, 'Dr' AS title
    FROM dual
  UNION ALL
  SELECT 2 AS id, 'BBB' AS NAME, NULL AS pid, 'Dr' AS title
    FROM dual
  UNION ALL
  SELECT 3 AS id, 'CCC' AS NAME, 1 AS pid, 'Mgr' AS title
    FROM dual
  UNION ALL
  SELECT 4 AS id, 'DDD' AS NAME, 2 AS pid, 'Mgr' AS title
    FROM dual
  UNION ALL
  SELECT 5 AS id, 'EEE' AS NAME, 1 AS pid, 'Sales' AS title
    FROM dual
  UNION ALL
  SELECT 6 AS id, 'FFF' AS NAME, 3 AS pid, 'Sales' AS title
    FROM dual
  UNION ALL
  SELECT 7 AS id, 'GGG' AS NAME, 4 AS pid, 'Sales' AS title FROM dual)
SELECT a.id   员工编号,
       a.name 员工姓名,
       b.id   上级编号,
       b.name 上级姓名,
       c.id   上级编号,
       c.name 上级姓名
  FROM temp a, temp b, temp c
WHERE b.id(+) = a.pid
   AND c.id(+) = b.pid
ORDER BY a.id;

使用道具 举报

回复
认证徽章
论坛徽章:
168
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB社区12周年站庆徽章
日期:2013-08-13 16:52:38itpub13周年纪念徽章
日期:2014-10-08 15:21:35ITPUB14周年纪念章
日期:2015-10-26 17:23:44ITPUB15周年纪念
日期:2018-02-09 14:12:58状元
日期:2015-11-19 12:58:23榜眼
日期:2015-11-19 12:58:23探花
日期:2015-11-19 12:58:23进士
日期:2015-11-19 12:59:09
5#
发表于 2018-7-5 12:51 | 只看该作者
各位,题目不是查询所有上级,而是他的总监(Dr)是谁
因为层级不一定,样例数据中就包含2层和3层,而且这个层级也可以是4层。
所以,各位再思考思考,期待大神出手~~

使用道具 举报

回复
认证徽章
论坛徽章:
168
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB社区12周年站庆徽章
日期:2013-08-13 16:52:38itpub13周年纪念徽章
日期:2014-10-08 15:21:35ITPUB14周年纪念章
日期:2015-10-26 17:23:44ITPUB15周年纪念
日期:2018-02-09 14:12:58状元
日期:2015-11-19 12:58:23榜眼
日期:2015-11-19 12:58:23探花
日期:2015-11-19 12:58:23进士
日期:2015-11-19 12:59:09
6#
发表于 2018-7-5 13:45 | 只看该作者
或者找到总监(Dr)所有的下属也可以
Dr  Dr_name Sales_name
1    AAA     EEE
1    AAA     FFF

使用道具 举报

回复
论坛徽章:
27
ITPUB官方微博粉丝徽章
日期:2011-08-17 10:35:36托尼托尼·乔巴
日期:2017-10-25 16:45:57秀才
日期:2017-04-05 13:18:06秀才
日期:2017-03-02 10:35:322016猴年福章
日期:2016-02-23 09:58:342016猴年福章
日期:2016-02-18 09:31:302015年新春福章
日期:2015-03-06 11:57:312014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31
7#
发表于 2018-7-5 13:53 | 只看该作者
把2楼的修改一下就可以了

select name as Sales, CONNECT_BY_ROOT(name) as Dr from temp
where CONNECT_BY_ISLEAF=1
START WITH pid is null
CONNECT BY pid= PRIOR id

使用道具 举报

回复
认证徽章
论坛徽章:
168
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB社区12周年站庆徽章
日期:2013-08-13 16:52:38itpub13周年纪念徽章
日期:2014-10-08 15:21:35ITPUB14周年纪念章
日期:2015-10-26 17:23:44ITPUB15周年纪念
日期:2018-02-09 14:12:58状元
日期:2015-11-19 12:58:23榜眼
日期:2015-11-19 12:58:23探花
日期:2015-11-19 12:58:23进士
日期:2015-11-19 12:59:09
8#
发表于 2018-7-5 14:07 | 只看该作者
本帖最后由 hai503 于 2018-7-5 14:25 编辑
gyhgood 发表于 2018-7-5 13:53
把2楼的修改一下就可以了

select name as Sales, CONNECT_BY_ROOT(name) as Dr from temp

非常感谢! SQL可用
CONNECT BY PRIOR id = pid 这一行,这样写可能更“喜闻乐见”一些

使用道具 举报

回复
论坛徽章:
496
紫蜘蛛
日期:2007-09-26 17:05:56奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:53
9#
发表于 2018-7-5 21:45 | 只看该作者
既然总监不是最顶层,开始条件就得改一下,如果sales下面可能还有,也应该及时刹车不要再往下走。最后改成:

select name as Sales, CONNECT_BY_ROOT(name) as Dr from temp
where CONNECT_BY_ISLEAF=1
START WITH title = 'Dr'
CONNECT BY pid= PRIOR id AND PRIOR title<>'Sales'
;   

注意这个是找出所有总监的所有sales, 如果你是已知某个sales要找出他一个人的总监,那得反过来:
select name as dr, CONNECT_BY_ROOT(name) as sales from temp
where CONNECT_BY_ISLEAF=1
START WITH NAME = 'GGG'
CONNECT BY id= PRIOR pid AND PRIOR title<>'Dr'
;        

使用道具 举报

回复
认证徽章
论坛徽章:
168
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB社区12周年站庆徽章
日期:2013-08-13 16:52:38itpub13周年纪念徽章
日期:2014-10-08 15:21:35ITPUB14周年纪念章
日期:2015-10-26 17:23:44ITPUB15周年纪念
日期:2018-02-09 14:12:58状元
日期:2015-11-19 12:58:23榜眼
日期:2015-11-19 12:58:23探花
日期:2015-11-19 12:58:23进士
日期:2015-11-19 12:59:09
10#
发表于 2018-7-6 08:53 | 只看该作者
newkid 发表于 2018-7-5 21:45
既然总监不是最顶层,开始条件就得改一下,如果sales下面可能还有,也应该及时刹车不要再往下走。最后改成 ...

资深新手,终于等到你!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表
http://www.vxiaotou.com