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
;