![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
階層データのあるテーブルで親から最下層の子までのパスを列挙するクエリ
すでに存在するシステムより親子関係のデータが自動的に作成されるのですが、
それをSQLクエリで並び替えることに苦労しています。
やりたいこと:
最上位の親から最下層の子までのパスを列挙するクエリを作成したい。
テーブル構造:
直属の親と子を1レコードで保存しています。
(ID=0は最上位の為、1が最上位の親)
TableName:Department
ID ParentID ChildID Order ChildName
-- -------- ------- ----- ---------
0 0 1 1 xx
1 0 2 1 aa
2 1 3 1 bb
3 1 4 2 cc
4 2 5 1 dd
5 2 6 2 ee
6 3 7 1 ff
7 3 8 2 gg
8 6 9 1 hh
9 6 10 2 ii
10 8 11 1 jj
クエリで以下のように表示したい。
Level1 Level2 Level3 Level4 Level5 NodeName
------ ------ ------ ------ ------ --------
1 xx
1 3 bb
1 4 cc
1 3 7 ff
1 3 8 gg
1 3 11 jj
2 aa
2 5 dd
2 6 ee
2 6 9 hh
2 6 10 ii
私が試したSQLクエリは以下となります。
select lev3.Level1,lev3.Level2,Level3,Level4,Node5.ChildID as Level5,ChildName from Department as Node5
Right Join(select lev2.Level1,lev2.Level2,lev2.Level3,Node4.ChildID as Level4,ChildName from Department as Node4
Right Join(select level.Level1, level.Level2,Node3.ChildID as Level3,ChildName from Department as Node3
Right Join(select Node1.ChildID as Level1,Node2.ChildID as Level2,ChildName from Department as Node2
Right Join(select ChildID,NodeName.ChildName from Department as Node0
inner Join tbDepartment as NodeName on Node0.ChildID=NodeName.ID
Right Join(select ChildID as N0 from Department where ParentID=0) as Node00
on Node00.N0=Node0.ParentID) as Node1
on Node1.ChildID=Node2.ParentID) as level
on level.N2=Node3.ParentID) as lev2
on lev2.N3=Node4.ParentID) as lev3
on lev3.N4=Node5.ParentID
これだと、パスの列挙はできるのですが、名前が最上位の親だけしかわからず、
あたまが混乱しています。
有効な列挙方法を教えてください。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
再帰CTEの話をすると混乱するかもしれませんので、とりあえず以下を。
ただ、クエリを見る限り、Accessっぽいのが気になります。
SELECT
CASE
WHEN d5.ChildID IS NOT NULL THEN d5.ChildID
WHEN d4.ChildID IS NOT NULL THEN d4.ChildID
WHEN d3.ChildID IS NOT NULL THEN d3.ChildID
WHEN d2.ChildID IS NOT NULL THEN d2.ChildID
WHEN d1.ChildID IS NOT NULL THEN d1.ChildID END,
CASE
WHEN d5.ChildID IS NOT NULL THEN d4.ChildID
WHEN d4.ChildID IS NOT NULL THEN d3.ChildID
WHEN d3.ChildID IS NOT NULL THEN d2.ChildID
WHEN d2.ChildID IS NOT NULL THEN d1.ChildID END,
CASE
WHEN d5.ChildID IS NOT NULL THEN d3.ChildID
WHEN d4.ChildID IS NOT NULL THEN d2.ChildID
WHEN d3.ChildID IS NOT NULL THEN d1.ChildID END,
CASE
WHEN d5.ChildID IS NOT NULL THEN d2.ChildID
WHEN d4.ChildID IS NOT NULL THEN d1.ChildID END,
CASE
WHEN d5.ChildID IS NOT NULL THEN d1.ChildID END,
COALESCE(d1.ChildName,d2.ChildName,d3.ChildName,d4.ChildName,d5.ChildName)
FROM Department d1
LEFT OUTER JOIN Department d2 ON d2.ChildID=d1.ParentID
LEFT OUTER JOIN Department d3 ON d3.ChildID=d2.ParentID
LEFT OUTER JOIN Department d4 ON d4.ChildID=d3.ParentID
LEFT OUTER JOIN Department d5 ON d5.ChildID=d4.ParentID
おお!いとも簡単に・・・
まだまだ勉強不足を痛感しています。こんな方法もあるんですね・・・
教えていただいて本当にありがとうございます。
ちなみに、Accessっぽいのは、もともとAccessから勉強しだした人間なので、
基礎が抜けきらない状態です。
SQLServer2000を手にしてSQL文を勉強しだしたので、初心者に近いです。・・・
再帰CTEなどの例文をいろいろやっていきま=す。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- PostgreSQL SQLで検索結果の記事を表示したい 1 2022/04/28 21:03
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- 先物取引 日本国債先物のCFD取引について 1 2023/08/04 18:09
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- PostgreSQL 投稿記事と関連付けているテーブルがわからない 1 2022/04/27 20:29
- 英語 節を列挙する例示表現について 2 2022/08/15 13:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS クエリで重複データを最...
-
ACCESSでクエリを作成したら「...
-
追加先の発見方法(SQL以外)
-
SQLで優先順位が高いレコードを...
-
ユニオンクエリについて
-
ACCESS クエリで、グループ化...
-
「データベースまたはオブジェ...
-
accessで選択クエリで得た全レ...
-
access・カウント結果がゼロで...
-
Access あるクエリを利用して...
-
ACCESSのVBAで
-
階層データのあるテーブルで親...
-
ACCESS のクエリー実行に異常に...
-
Accessのフィルタ検索でデータ...
-
アクセスでフォームが更新でき...
-
ACCESSにてフィールド間の最小...
-
access:連続データ入力
-
SQL2005 調和平均
-
テーブルに主キーを作らないデ...
-
アクセスのフォームのビューが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESS クエリで重複データを最...
-
ACCESSでクエリを作成したら「...
-
ACCESS クエリで、グループ化...
-
access・カウント結果がゼロで...
-
「データベースまたはオブジェ...
-
クエリで「データ型が一致しま...
-
ACCESS クエリー 抽出条件が...
-
ACCESSで2つのテーブル比較で...
-
accessで選択クエリで得た全レ...
-
ACCESSにてフィールド間の最小...
-
access:連続データ入力
-
追加先の発見方法(SQL以外)
-
アクセスのスナップショット
-
ACCESS のクエリー実行に異常に...
-
ユニオンクエリについて
-
SQLで優先順位が高いレコードを...
-
Access あるクエリを利用して...
-
Accessで「クエリーが複雑すぎ...
-
Accessのフィルタ検索でデータ...
-
月別の利用者実人員の集計方法
おすすめ情報