【发布时间】:2016-11-04 14:25:26
【问题描述】:
在过去的几天里,我一直在为我的作业寻找解决方案,但我似乎找不到答案。
简介:假设我们有一个名为 People 的表。每个人都有三个字段:name、boss 和 position。 name 是主键,position 只是一个字符串,boss 作为外键指向另一个人的name。它创建了一个普通的树,如 Person1 -> Person2 -> Person3 -> Person4 ,其中 Person4 将是最高老板, Person1 是根。为简单起见,我们假设没有人拥有超过 3 个老板,而 Person4 是头老板(唯一一个 boss 等于 null 的人。)
示例路径:
Person7 -> Person4
Person6 -> Person8 -> Person4
Person2 -> Person8 -> Person4
所以我的任务是:创建一个查询,以分层顺序显示每个老板的名称,其中position 等于“工人”或“经理”仅使用树操作(连接方式, connect_by_root 等)和子查询
输出表必须包含 5 列:
Name | Position | Boss 1 | Boss 2 | Boss 3
如果任何老板列为空,那么我应该插入一些空格。
这是我目前的查询:
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
是否有任何解决方案不使用诸如 Pivot 之类的复杂功能来使其工作?
【问题讨论】:
-
只有
max或min函数。并将... name else ' ' end ...替换为... name else null end ... -
这些函数变成子查询了吗?