回答編集履歴

4

推敲

2017/10/06 09:10

投稿

sazi
sazi

スコア25173

test CHANGED
@@ -98,7 +98,7 @@
98
98
 
99
99
  親を辿る方向で外部結合し、その状況から何階層目かを求めます(ここポイント)
100
100
 
101
- その階層情報から取得すべき位置の情報を判定し求めます。
101
+ その位置情報から取得すべき階層を判定し求めます。
102
102
 
103
103
  ※元データにこの何階層目かを判断できる情報があれば、その分簡潔になります。
104
104
 

3

修正

2017/10/06 09:10

投稿

sazi
sazi

スコア25173

test CHANGED
@@ -1,4 +1,4 @@
1
- こういった自己結合によるツリー形式のテーブルには```with recursive```による再帰読出を使用すると、階層の深さなどを条件として意識する必要がありません。
1
+ こういった自己結合によるツリー形式のテーブル(ナイーブツリー)には```with recursive```による再帰読出を使用すると、階層の深さなどを条件として意識する必要がありません。
2
2
 
3
3
  但し、自己結合の関係(今回であれば、idとparent_id)がループするデータがあると無限ループします。
4
4
 

2

追記

2017/10/06 08:12

投稿

sazi
sazi

スコア25173

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

追記

2017/10/06 07:53

投稿

sazi
sazi

スコア25173

test CHANGED
@@ -88,4 +88,6 @@
88
88
 
89
89
  -- where lvl<=4
90
90
 
91
+ order by lvl_name
92
+
91
93
  ```