回答編集履歴
4
推敲
test
CHANGED
@@ -98,7 +98,7 @@
|
|
98
98
|
|
99
99
|
親を辿る方向で外部結合し、その状況から何階層目かを求めます(ここポイント)
|
100
100
|
|
101
|
-
その
|
101
|
+
その位置情報から取得すべき階層を判定し求めます。
|
102
102
|
|
103
103
|
※元データにこの何階層目かを判断できる情報があれば、その分簡潔になります。
|
104
104
|
|
3
修正
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
こういった自己結合によるツリー形式のテーブルには```with recursive```による再帰読出を使用すると、階層の深さなどを条件として意識する必要がありません。
|
1
|
+
こういった自己結合によるツリー形式のテーブル(ナイーブツリー)には```with recursive```による再帰読出を使用すると、階層の深さなどを条件として意識する必要がありません。
|
2
2
|
|
3
3
|
但し、自己結合の関係(今回であれば、idとparent_id)がループするデータがあると無限ループします。
|
4
4
|
|
2
追記
test
CHANGED
@@ -44,7 +44,7 @@
|
|
44
44
|
|
45
45
|
```
|
46
46
|
|
47
|
-
問い合わせ
|
47
|
+
問い合わせ(Postgres)
|
48
48
|
|
49
49
|
---
|
50
50
|
|
@@ -91,3 +91,55 @@
|
|
91
91
|
order by lvl_name
|
92
92
|
|
93
93
|
```
|
94
|
+
|
95
|
+
追記 問い合わせ(Hive)
|
96
|
+
|
97
|
+
---
|
98
|
+
|
99
|
+
親を辿る方向で外部結合し、その状況から何階層目かを求めます(ここポイント)
|
100
|
+
|
101
|
+
その階層情報から取得すべき位置の情報を判定し求めます。
|
102
|
+
|
103
|
+
※元データにこの何階層目かを判断できる情報があれば、その分簡潔になります。
|
104
|
+
|
105
|
+
```SQL
|
106
|
+
|
107
|
+
select id, parent_id, name
|
108
|
+
|
109
|
+
, case lvl when 4 then name_nest4 when 3 then name_nest3 when 2 then name_nest2 when 1 then name_nest1 end as name1
|
110
|
+
|
111
|
+
, case lvl when 4 then name_nest3 when 3 then name_nest2 when 2 then name_nest1 end as name2
|
112
|
+
|
113
|
+
, case lvl when 4 then name_nest2 when 3 then name_nest1 end as name3
|
114
|
+
|
115
|
+
, case lvl when 4 then name_nest1 end as name4
|
116
|
+
|
117
|
+
from (
|
118
|
+
|
119
|
+
select t1.*
|
120
|
+
|
121
|
+
, t1.name as name_nest1
|
122
|
+
|
123
|
+
, t2.name as name_nest2
|
124
|
+
|
125
|
+
, t3.name as name_nest3
|
126
|
+
|
127
|
+
, t4.name as name_nest4
|
128
|
+
|
129
|
+
, case when t4.id is not null then 4
|
130
|
+
|
131
|
+
else case when t3.id is not null then 3
|
132
|
+
|
133
|
+
else case when t2.id is not null then 2 else 1 end
|
134
|
+
|
135
|
+
end end as lvl
|
136
|
+
|
137
|
+
from list t1 left join list t2 on t2.id=t1.parent_id
|
138
|
+
|
139
|
+
left join list t3 on t3.id=t2.parent_id
|
140
|
+
|
141
|
+
left join list t4 on t4.id=t3.parent_id
|
142
|
+
|
143
|
+
) step1
|
144
|
+
|
145
|
+
```
|
1
追記
test
CHANGED
@@ -88,4 +88,6 @@
|
|
88
88
|
|
89
89
|
-- where lvl<=4
|
90
90
|
|
91
|
+
order by lvl_name
|
92
|
+
|
91
93
|
```
|