【问题标题】:Query to retrieve manager before employee查询在员工之前检索经理
【发布时间】:2018-02-23 17:35:38
【问题描述】:

我们有资源列表及其经理(不是完整的层次结构)。我们现在需要检索资源列表,以便资源的经理行应始终出现在资源行之前。我已经尝试过分层查询,但是鉴于数据集,我不确定它是否正常工作。有什么指点或线索,请确认订单?

编辑:在数据集中添加了最后一行,查询似乎不再起作用。


sqlfiddle

select level, emp, mgr 
from emp
where level = 1
connect by prior emp = mgr -- and level = 1 

数据集

员工 |经理 ------------ A11 | A1 A12 | A1 B1 |乙 C12 | C1 A1 |一种 C1 | C C21 | C2 一个 | C

预期的有序结果集

员工 |经理 ------------ 一个 | C A1 |一种 A11 | A1 A12 | A1 B1 |乙 C1 | C C12 | C1 C21 | C2

【问题讨论】:

  • 那么你需要Emp升序排序的输出吗?

标签: oracle hierarchy connect-by hierarchical-query


【解决方案1】:
select level, emp, mgr
from emp
connect by mgr = prior emp
start with mgr in (select mgr from emp minus select emp from emp)
order by emp, mgr;

【讨论】:

  • 工作到一定程度。现在,当我添加一个新记录时,mgr = emp,它创建了一个循环。然后我添加了 nocycle 子句,但是它现在返回了一个额外的行 => sqlfiddle
  • 好吧,这看起来像是不可靠的数据 - 在您的 sqlfiddle 中,您似乎有多种方法可以将员工标记为没有经理(null,'root',mgr = emp),选择一个并坚持有了它
  • 好吧,根是有效的案例,我添加它是为了更好的清晰度和层次结构可见性。现在我们可以忽略 mgr 为空,因为它只是为了验证更广泛的测试用例。其他情况,其中 mgr = emp 是有效的情况,查询不适用于这种情况。
猜你喜欢
  • 1970-01-01
  • 2013-08-02
  • 2020-03-12
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多