回答編集履歴

1

参考サイトとサンプルを追記

2020/06/12 01:54

投稿

toyotaku
toyotaku

スコア103

test CHANGED
@@ -3,3 +3,101 @@
3
3
 
4
4
 
5
5
  [SQLの抽出結果を階層構造で表示するテクニック](https://www.atmarkit.co.jp/ait/articles/0507/28/news131.html)
6
+
7
+
8
+
9
+ [図でイメージするOracle DatabaseのSQL全集 第6回 階層問い合わせ Oracle SQLの各機能をイメージ図を交えて解説](https://www.oracle.com/jp/technical-resources/article/otnj-sql-image6.html)
10
+
11
+
12
+
13
+ 自レコードよりも上位の階層でかつフラグが1になっている階層の名称を取得
14
+
15
+ 各レコードをルート(最上位)とし、
16
+
17
+ 上位レコードのPARENT_IDとIDが一致する下位レコードを問い合わせ、
18
+
19
+ FLAGが1のレコードの名前を取得する
20
+
21
+ ```SQL
22
+
23
+ SELECT
24
+
25
+ CONNECT_BY_ROOT(ID) AS ROOT_ID
26
+
27
+ , CONNECT_BY_ROOT(NAME) AS ROOT_NAME
28
+
29
+ , CASE
30
+
31
+ WHEN
32
+
33
+ FLAG = 1
34
+
35
+ AND CONNECT_BY_ROOT(ID) != ID --自レコードのフラグが1の場合は表示しない
36
+
37
+ THEN NAME
38
+
39
+ ELSE NULL
40
+
41
+ END AS FLAG1_NAME
42
+
43
+ FROM
44
+
45
+ TBL
46
+
47
+ WHERE
48
+
49
+ CONNECT_BY_ISLEAF = 1 -- LEAF行だけを取得
50
+
51
+ CONNECT BY
52
+
53
+ PRIOR PARENT_ID = ID -- PARENT_IDで下位レコードのIDと紐づける
54
+
55
+ AND PRIOR FLAG != 1 -- FLAGが1なら下位レコードを問い合わせない
56
+
57
+ ORDER BY
58
+
59
+ CONNECT_BY_ROOT(ID)
60
+
61
+ ```
62
+
63
+
64
+
65
+ 階層レベルが2の階層の名称を取得
66
+
67
+ 各レコードをルート(最上位)とし、
68
+
69
+ 上位レコードのPARENT_IDとIDが一致する下位レコードを問い合わせ、
70
+
71
+ 親レコードのPARENT_IDがNULLではないレコードまで問い合わせる
72
+
73
+ ※親レコードのPARENT_IDがNULL = 階層レベル2
74
+
75
+ ```SQL
76
+
77
+ SELECT
78
+
79
+ CONNECT_BY_ROOT(ID) AS ROOT_ID
80
+
81
+ , CONNECT_BY_ROOT(NAME) AS ROOT_NAME
82
+
83
+ , NVL2(PARENT_ID,NAME,NULL) LEVEL2_NAME
84
+
85
+ FROM
86
+
87
+ TBL
88
+
89
+ WHERE
90
+
91
+ CONNECT_BY_ISLEAF = 1 -- LEAF行だけを取得
92
+
93
+ CONNECT BY
94
+
95
+ PRIOR PARENT_ID = ID -- PARENT_IDで下位レコードのIDと紐づける
96
+
97
+ AND PARENT_ID IS NOT NULL -- 親レコードのPARENT_IDがNULLは対象にしない(=レベル2)
98
+
99
+ ORDER BY
100
+
101
+ CONNECT_BY_ROOT(ID)
102
+
103
+ ```