回答編集履歴
1
参考サイトとサンプルを追記
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
|
+
```
|