過去数日間、私の課題の解決に取り組んでおり、答えが見つからないようです。Oracle SQLのconnect_by_rootとサブクエリ
はじめに:という単一のテーブルがあるとします。各個人には、name
,boss
およびposition
という3つのフィールドがあります。 name
がプライマリキーである場合は、の文字列との外部キーが異なる人のname
を指しています。 Person1 - > Person2 - > Person3 - > Person4のような通常のツリーを作成します。ここでPerson4は最高のボス、Person1はルートです。簡単にするためのは、誰もが3つの以上のボスを持っていない、とPerson4はヘッドボスであると仮定しよう
例パス:
Person7 - > Person4
Person6(null
に等しいboss
を持つ唯一の人。) - > Person8 - > Person4
PERSON2 - > Person8 - > Person4
だから私の割り当ては言う:階層ORDに表示されるクエリを作成ER等しいposition
「労働者」又は「マネージャ」のみツリー操作を使用して(CONNECT_BY_ROOT等による接続)とサブクエリ
出力テーブルを持つすべての人のために、各ボスの名前は5列で構成しなければなりません。
Name | Position | Boss 1 | Boss 2 | Boss 3
任意のボス列がNULLになる場合、私はいくつかの空白を挿入する必要があります。
これは、これまでのところ、私のクエリです:
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'機能。 '... else else '' end ...'を '... name else null end ... 'と置き換えてください。 – Dmitry
これらの関数はサブクエリに変換されますか? – Karatte