我有以下查询返回公司的所有经理
Select emp_id
from Managers
where ... some more conditions
现在,如果我想获得经理(高级经理)的经理,我将不得不写下面的查询:
select emp_id
from Managers
where emp_number = (Select emp_id
from Managers)
这将返回如下内容:
Manager Senior manager
0001 1111
0002 1111
0003 1111
0004 2222
0005 2222
根据上述记录,高级经理可以包含许多经理。我想获取'1111'下的所有经理。总之,我想颠倒上面的查询。我尝试了很多方法,但它们看起来很冗长。 (上面的查询只是一个例子。真正的查询要大得多)
有人能建议更简单的方法吗?
答案 0 :(得分:1)
您想要使用CONNECT BY
查询:
SELECT emp_id
FROM managers
START WITH emp_id = '1111'
CONNECT BY emp_id = PRIOR emp_number;
根据您的示例,听起来好像列 emp_id 是员工的主键,而 emp_number 是员工经理的自我引用外键,允许您从这一个表构建层次结构。为了使您的示例更清晰,似乎 emp_number 应该命名为 manager_id :
-- Will show you all of the hierarchy ABOVE emp_id 1111
SELECT emp_id
FROM managers
START WITH emp_id = '1111'
CONNECT BY emp_id = PRIOR manager_id;
使用CONNECT BY
的另一个例子是找到汇总到层次结构中父级的所有子项:
-- Will show you all of the hierarchy BELOW emp_id 1111
SELECT emp_id
FROM managers
START WITH emp_id = '1111'
CONNECT BY manager_id = PRIOR emp_id;