在过去的几天里,我正在为我的任务开发解决方案,而我似乎无法找到答案。Oracle SQL connect_by_root和子查询
介绍:假设我们有一张叫的人。每个人有三个字段:name
,boss
和position
。 name
是主键,position
只是一个字符串,boss
作为外键指向不同的人的name
。它创建了一个像Person1 - > Person2 - > Person3 - > Person4这样的普通树,其中Person4是最高级的boss,Person1是root。为简单起见让我们假设没有人具有多于3个老板,Person4是头老板
实施例的路径(的唯一的人与boss
等于null
):
Person7 - > Person4
Person6 - > Person8 - > Person4
PERSON2 - > Person8 - > Person4
所以我的任务说:创建一个显示在分层ORD查询呃,每个老板的每个人的名字position
等于“工人”,或只使用树操作(通过连接,CONNECT_BY_ROOT等)“经理” 和子
输出表必须由5列:
Name | Position | Boss 1 | Boss 2 | Boss 3
如果任何boss列将为空,那么我应该插入一些空格。
这是我的查询到目前为止:
select
case
when l = 1 then name else ' ' end as "Name",
position,
case
when l = 2 then name else ' ' end as "Boss 1",
case
when l = 3 then name else ' ' end as "Boss 2",
case
when l = 4 then name else ' ' end as "Boss 3"
from (
select
connect_by_root position as position,
level as l,
name
from
People
connect by prior
boss = name
start with
position = 'Worker'
or position = 'Manager'
);
它有点做的伎俩,但树的每个级别是一个新行,这件事情我必须避免。我知道为什么这个查询产生这样的结果,但我不知道如何使它遍历树而不在每一步创建新行。
我的结果:
Name |Position|Boss 1|Boss 2|Boss 3
JOHN WORKER
WORKER HENRY
WORKER PETER
TERRY WORKER
WORKER PETER
ALICE WORKER
WORKER PETER
BILL MANAGER
MANAGER JAMES
MANAGER PETER
这是结果我想要实现:
Name |Position|Boss 1|Boss 2|Boss 3
JOHN WORKER HENRY PETER
TERRY WORKER PETER
ALICE WORKER PETER
BILL MANAGER JAMES PETER
请问有什么解决,而无需使用复杂的功能,如透视,使其工作?
只是'max'或'min'功能。并且用'... name else'结尾...'替换'... name else''end ...' – Dmitry
这些函数放入子查询中? – Karatte