如何反转oracle查询

时间:2014-05-02 11:10:04

标签: sql oracle10g

我有以下查询返回公司的所有经理

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'下的所有经理。总之,我想颠倒上面的查询。我尝试了很多方法,但它们看起来很冗长。 (上面的查询只是一个例子。真正的查询要大得多)

有人能建议更简单的方法吗?

1 个答案:

答案 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;