在過去的幾天裏,我正在爲我的任務開發解決方案,而我似乎無法找到答案。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