编写返回层次结构所有成员的查询
Writing a query returning all members of a hierarchy
我在编写对我的水平来说似乎相当复杂的查询时遇到了问题。
问题很简单:只用了一个tableressources(id_ressource, name, id_manager)
如您所料,id_manager
指的是另一个 id_ressource
。我想要的是获得特定经理下所有资源的列表。但是一个经理可能会被其他经理的经理等等:我想把所有的资源都归他所有,包括经理自己。
到目前为止我的查询是最简单的:
SELECT name FROM ressources WHERE id_manager = :MANAGER_VAR;
我知道我可能会使用其中的一些 CONNECT BY, PRIOR
,但我几乎没有使用它的经验,非常感谢任何帮助。
从 Oracle 11gR2 开始,您可以使用标准递归 CTE 而不是旧的 CONNECT BY
。
例如:
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 知识有点生疏)。假设您有 table 员工关系:employees(id_employee, id_manager)
SELECT DISTINCT r.name
FROM ressources r
JOIN employees e on r.id_manager = e.id_employee
START WITH r.id_manager = :MANAGER_VAR
CONNECT BY PRIOR e.id_employee= r.id_manager
分层查询 (connect by
) 如下所示:
select name
from ressources -- check your spelling?
start with id_ressource = :manager_var
connect by id_manager = prior id_ressource
;
这里:manager_var
是输入变量(绑定变量,如您尝试的那样)。
我在编写对我的水平来说似乎相当复杂的查询时遇到了问题。
问题很简单:只用了一个tableressources(id_ressource, name, id_manager)
如您所料,id_manager
指的是另一个 id_ressource
。我想要的是获得特定经理下所有资源的列表。但是一个经理可能会被其他经理的经理等等:我想把所有的资源都归他所有,包括经理自己。
到目前为止我的查询是最简单的:
SELECT name FROM ressources WHERE id_manager = :MANAGER_VAR;
我知道我可能会使用其中的一些 CONNECT BY, PRIOR
,但我几乎没有使用它的经验,非常感谢任何帮助。
从 Oracle 11gR2 开始,您可以使用标准递归 CTE 而不是旧的 CONNECT BY
。
例如:
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 知识有点生疏)。假设您有 table 员工关系:employees(id_employee, id_manager)
SELECT DISTINCT r.name
FROM ressources r
JOIN employees e on r.id_manager = e.id_employee
START WITH r.id_manager = :MANAGER_VAR
CONNECT BY PRIOR e.id_employee= r.id_manager
分层查询 (connect by
) 如下所示:
select name
from ressources -- check your spelling?
start with id_ressource = :manager_var
connect by id_manager = prior id_ressource
;
这里:manager_var
是输入变量(绑定变量,如您尝试的那样)。