
以下のような3階層のデータについて、以下の結果を得たいと思っています。再帰クエリを使用することになるかと思うのですが、どのようにクエリを作成すればよいでしょうか。アドバイスをお願いいたします。
<データ>
氏名 上司の氏名 階層
田中 Null 1
山田 田中 2
佐藤 山田 3
高田 山田 3
<結果>
氏名 部下の氏名
田中 山田
田中 佐藤
田中 高田
山田 佐藤
山田 高田
佐藤 Null
高田 Null
※ 部下の氏名は直下の部下だけでなく、直下の部下の、その下まで結果として返したい。
No.1ベストアンサー
- 回答日時:
通常のCTEでは直前の階層をもとに次の階層のデータを返すという繰り返しになるため、今回の目的の結果にはなりません。
また、最後の2行(部下がいない)は、CTEに外部結合が認められないので出すことができません。
したがって、すべてをアンカーメンバーとして最後の2行は後で付加する方式で考えると以下のようになると思います。
WITH 階層データ AS
(SELECT 上司の氏名,氏名,階層,上司の氏名 元の上司, 階層 元の階層
FROM データ
WHERE 上司の氏名 IS NOT NULL
UNION ALL
SELECT d.上司の氏名,d.氏名,d.階層, h.元の上司,h.階層
FROM データ d
INNER JOIN 階層データ h ON h.氏名=d.上司の氏名)
SELECT 元の上司,氏名
FROM
(SELECT 元の上司,氏名,元の階層,階層
FROM 階層データ
UNION ALL
SELECT 氏名,NULL,階層+1,階層+1
FROM データ
WHERE 氏名 NOT IN
(SELECT ISNULL(上司の氏名,'') FROM データ)
) tmp
ORDER BY 元の階層,階層
回答ありがとうございます。
クエリを理解するのに少し時間がかかりそうです。実際にクエリを実行してみて、仕組みを理解できるようにしたいと思います。取り急ぎお礼させていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「同行」は失礼な言葉でしょうか
-
これは脈ありの可能性あります...
-
仕事のミス、明日にでも報告す...
-
目標に向かって一緒に頑張る、...
-
飲み会で泥酔、記憶がないまま...
-
「弊社○○のご紹介で初めてご連...
-
「いじめたくなる」と言われた...
-
無災害目標時間の計算
-
取引先へ方へ自社の上司の紹介...
-
上司からの既読は付くが、LINE...
-
上司から電話があったのですが...
-
自分のことを自分の苗字で呼ぶ
-
大丈夫です。わかります。の敬語
-
メールでの返事、「顧客上司」...
-
50~60代男性上司を持つ、30~4...
-
上司に返事をするとき
-
相棒の内村刑事部長と中村参事...
-
FAX送信を上司に頼まれた場合
-
飲み会のマナー(生ビールの順...
-
飲み会での失敗
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
これは脈ありの可能性あります...
-
「同行」は失礼な言葉でしょうか
-
「弊社○○のご紹介で初めてご連...
-
無災害目標時間の計算
-
取引先へ方へ自社の上司の紹介...
-
来られました いらっしゃいました
-
飲み会で泥酔、記憶がないまま...
-
目標に向かって一緒に頑張る、...
-
メールの宛名の冒頭に書いてあ...
-
相棒の内村刑事部長と中村参事...
-
メールでの返事、「顧客上司」...
-
友達に怒られたのですが、理由...
-
こんにちは、よろしくお願いし...
-
仕事のミス、明日にでも報告す...
-
上司から電話があったのですが...
-
「もう結構です。」の意味
-
飲み会のマナー(生ビールの順...
-
上司からの既読は付くが、LINE...
-
例えば可愛がっていた部下の女...
-
FAX送信を上司に頼まれた場合
おすすめ情報