oracle递归查询经理下的员工,将经理降一级

标签 oracle recursion

我有一个员工表,可以通过employeeid = managerid解除循环

我希望结果集中的内容是 {employeeid, 1-level-down-from-request}

如此给出

Employeeid - Managerid
Bob - Null
Jill - Bob
John - Bob
Suzy - Jill
Shannon - Jill
Shawn - Jill
Ron - John
Rick - John
Xavier - Shawn

如果我对 Bob 运行查询,我们会得到

Shannon - Jill
Shawn - Jill
Ron - John
Rick - John
Xavier - Jill

请注意,Xavier 去找了 Jill,而不是 Shawn,因为 Jill 是 Xavier 的高级经理(比 Bob 低一级)

最佳答案

最简单的方法可能是进行自连接

SELECT employee.employeeId,
       employee.managerId
  FROM table_name mgr,
       table_name subordinate,
       table_name employee
 WHERE mgr.managerId = subordinate.employeeId
   AND subordinate.managerId = employee.managerId
   AND mgr.employeeId = 'Bob'

但是,构建分层查询会更高效、更通用。类似的东西

SELECT *
  FROM (SELECT employeeId, managerId, level lvl
          FROM table_name
         START WITH employeeId = 'Bob'
       CONNECT BY prior employeeId = managerId)
 WHERE lvl = 3

显然,更改后一个查询来更改您是否需要直接报告、二级报告或层次结构的其他级别会更容易。而且通常也会更加高效。

关于oracle递归查询经理下的员工,将经理降一级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6865131/

相关文章:

oracle - JSF Faces Bridge 在部署到 oc4j 容器时得到 java.lang.NullPointerException

javascript - 当目的地很远时如何获得平滑的谷歌地图 panTo()

python - 在没有递归的情况下计算任意嵌套列表列表中的所有元素

sql - 查询未按预期工作

sql - Oracle:分割分隔字符串并选择大于输入日期的日期

c# - 将 OracleParameter.Value 转换为 Int32

c - 为什么下面的代码会出现段错误问题?

c++ - 递归生成排列

haskell - OCaml 中的相互递归类型

sql - Oracle DB Order Tree Siblings By Sibling Linked List