Sql 编写返回层次结构所有成员的查询

Sql 编写返回层次结构所有成员的查询,sql,oracle,hierarchy,Sql,Oracle,Hierarchy,我在写一个对于我这个级别来说似乎相当复杂的查询时遇到了麻烦 问题很简单:它只使用一个表resources(id\u resource,name,id\u manager) 您可能会猜到,id\u管理器引用了另一个id\u资源。我想要的是得到一份由特定经理管理的所有资源的列表。但是一个管理者可能会被其他管理者的管理者所左右,诸如此类:我想让所有的资源都在他手下,包括管理者自己 到目前为止,我的问题最简单: SELECT name FROM ressources WHERE id_manager =

我在写一个对于我这个级别来说似乎相当复杂的查询时遇到了麻烦

问题很简单:它只使用一个表
resources(id\u resource,name,id\u manager)

您可能会猜到,
id\u管理器
引用了另一个
id\u资源
。我想要的是得到一份由特定经理管理的所有资源的列表。但是一个管理者可能会被其他管理者的管理者所左右,诸如此类:我想让所有的资源都在他手下,包括管理者自己

到目前为止,我的问题最简单:

SELECT name FROM ressources WHERE id_manager = :MANAGER_VAR;

我知道我可能正在使用一些以前的
连接方式,但我几乎没有使用它的经验,非常感谢您的帮助。

从Oracle 11gR2开始,您可以使用标准的递归CTE,而不是旧的
连接方式

例如:

with
n (id_ressource, name, id_manager) as (
  select * from resources where id_manager = 123 -- starting point
 union all
  select r.*
  from n
  join ressources r on r.id_manager = n.id_ressource
)
select * from n

应该为
CONNECT BY
工作(我的Oracle知识有点生疏)。假设您有一个包含员工关系的表:
employees(id\u employee,id\u manager)

分层查询(
connectby
)如下所示:

select  name
from    ressources               --  check your spelling?
start   with id_ressource = :manager_var
connect by   id_manager   = prior id_ressource
;

此处
:manager\u var
是输入变量(绑定变量,如您尝试的那样)。

不幸的是,我不需要使用关系表。那么您如何知道某个人是另一个人的经理?你把他们当作“资源”吗?是的,你知道,如果那个人有身份证,经理=另一个身份证。谢谢你的帮助!您的Oracle似乎还可以,但您对数据的理解还不够。这些关系都在一个表中:employee id=1403(例如),id\u manager=3438。然后3438也出现在employee id列中,该行还有一个id_经理(不管3438的经理是谁)。等等。这里不需要两张桌子。这就是我要找的。干得好,谢谢!我不知道我们可以这样做递归查询,它很漂亮。但是请注意,对于
connectby
与递归查询一样有效的查询,
connectby
要快得多。这是完全可以理解的;递归查询比
connectby
更灵活、功能更强大,但这会带来很大的开销。当不需要额外的开销时,最好避免。@mathguy我想我以前读过你的类似评论,我不记得是谁写的了。如果是你,你能提供一些关于这方面的信息、文章或文档吗?我想了解更多细节。谢谢。请看这个定时测试:好的,我看它似乎比递归查询更简单。谢谢你,现在我有两种方法,真的很好。
select  name
from    ressources               --  check your spelling?
start   with id_ressource = :manager_var
connect by   id_manager   = prior id_ressource
;