Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вставка записи в дерево / 12 сообщений из 12, страница 1 из 1
21.12.2020, 11:02
    #40029654
Pastic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в дерево
Есть такое дерево:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
select '1.' code from dual union all
select '1.1.' from dual union all
select '1.2.' from dual union all
select '1.3.' from dual union all
select '1.3.1.' from dual union all
select '1.3.1.1.' from dual union all
select '1.3.1.2.' from dual union all
select '1.3.2.' from dual union all
select '1.3.3.' from dual union all
select '1.4.' from dual union all
select '1.5.' from dual union all
select '1.6.' from dual union all
select '1.7.' from dual union all
select '2.' from dual union all
select '2.1.' from dual union all
select '2.1.1.' from dual union all
select '2.1.2.' from dual union all
select '2.1.3.' from dual union all
select '2.2.' from dual union all
select '2.2.1.' from dual union all
select '2.2.2.' from dual union all
select '2.3.' from dual union all
select '2.4.' from dual union all
select '2.5.' from dual union all
select '2.6.' from dual union all
select '2.7.' from dual union all
select '2.8.' from dual union all
select '2.8.1.' from dual union all
select '2.8.2.' from dual union all
select '2.8.3.' from dual union all
select '2.9.' from dual union all
select '2.9.1.' from dual union all
select '2.9.2.' from dual union all
select '2.9.3.' from dual union all
select '2.9.4.' from dual union all
select '2.9.5.' from dual union all
select '2.10.' from dual union all
select '2.10.1.' from dual union all
select '2.10.2.' from dual union all
select '2.10.3.' from dual union all
select '2.10.4.' from dual union all
select '2.11.' from dual union all
select '3.' from dual union all
select '3.1.' from dual union all
select '3.1.1.' from dual union all
select '3.1.2.' from dual union all
select '3.1.3.' from dual union all
select '3.1.4.' from dual union all
select '3.1.5.' from dual union all
select '3.1.6.' from dual union all
select '3.1.7.' from dual union all
select '3.1.8.' from dual union all
select '3.2.' from dual union all
select '3.2.1.' from dual union all
select '3.2.1.1.' from dual union all
select '3.2.1.2.' from dual union all
select '3.2.1.3.' from dual union all
select '3.2.1.4.' from dual union all
select '3.2.1.5.' from dual union all
select '3.2.1.6.' from dual union all
select '3.2.2.' from dual union all
select '3.2.2.1.' from dual union all
select '3.2.2.2.' from dual union all
select '3.2.2.3.' from dual union all
select '3.2.2.4.' from dual union all
select '3.2.2.5.' from dual union all
select '3.2.3.' from dual union all
select '3.2.4.' from dual union all
select '3.2.5.' from dual union all
select '3.2.6.' from dual union all
select '3.2.7.' from dual union all
select '3.2.8.' from dual union all
select '3.2.9.' from dual union all
select '3.2.10.' from dual union all
select '3.2.11.' from dual union all
select '3.2.12.' from dual union all
select '3.2.12.1.' from dual union all
select '3.2.12.2.' from dual union all
select '3.2.12.3.' from dual union all
select '3.2.12.4.' from dual union all
select '3.2.12.5.' from dual union all
select '3.2.12.6.' from dual union all
select '3.2.12.7.' from dual union all
select '3.2.12.8.' from dual union all
select '3.2.13.' from dual union all
select '3.2.14.' from dual union all
select '3.2.15.' from dual union all
select '3.2.16.' from dual union all
select '4.' from dual union all
select '4.1.' from dual union all
select '4.2.' from dual union all
select '4.3.' from dual union all
select '4.4.' from dual union all
select '4.5.' from dual union all
select '4.6.' from dual union all
select '5.' from dual union all
select '5.1.' from dual union all
select '5.1.1.' from dual union all
select '5.1.2.' from dual union all
select '5.1.3.' from dual union all
select '5.1.4.' from dual union all
select '5.1.5.' from dual union all
select '5.2.' from dual union all
select '5.2.1.' from dual union all
select '5.2.2.' from dual union all
select '5.2.3.' from dual union all
select '5.2.4.' from dual union all
select '5.3.' from dual union all
select '5.3.1.' from dual union all
select '5.3.2.' from dual union all
select '5.4.' from dual union all
select '5.4.1.' from dual union all
select '5.4.2.' from dual union all
select '5.5.' from dual union all
select '6.' from dual union all
select '6.1.' from dual union all
select '6.2.' from dual union all
select '6.3.' from dual union all
select '6.3.1.' from dual union all
select '6.3.2.' from dual union all
select '6.3.3.' from dual union all
select '6.3.4.' from dual union all
select '6.3.5.' from dual union all
select '6.4.' from dual union all
select '6.4.1.' from dual union all
select '6.4.2.' from dual union all
select '6.4.3.' from dual union all
select '6.5.' from dual union all
select '6.6.' from dual union all
select '7.' from dual union all
select '7.1.' from dual union all
select '7.1.1.' from dual union all
select '7.1.2.' from dual union all
select '7.2.' from dual union all
select '7.2.1.' from dual union all
select '7.2.2.' from dual union all
select '7.3.' from dual union all
select '7.4.' from dual union all
select '7.4.1.' from dual union all
select '7.4.2.' from dual union all
select '7.5.' from dual union all
select '7.6.' from dual union all
select '8.' from dual union all
select '8.1.' from dual union all
select '8.1.1.' from dual union all
select '8.1.2.' from dual union all
select '8.1.2.1.' from dual union all
select '8.1.2.2.' from dual union all
select '8.1.3.' from dual union all
select '8.1.4.' from dual union all
select '8.2.' from dual union all
select '8.2.1.' from dual union all
select '8.2.2.' from dual union all
select '8.2.2.1.' from dual union all
select '8.2.2.2.' from dual union all
select '8.2.2.3.' from dual union all
select '8.2.3.' from dual union all
select '8.2.4.' from dual union all
select '8.2.5.' from dual union all
select '8.3.' from dual union all
select '8.3.1.' from dual union all
select '8.3.2.' from dual union all
select '8.3.3.' from dual union all
select '8.3.4.' from dual union all
select '8.4.' from dual union all
select '9.' from dual union all
select '9.1.' from dual union all
select '9.2.' from dual union all
select '9.3.' from dual union all
select '9.4.' from dual union all
select '9.5.' from dual union all
select '9.6.' from dual union all
select '10.' from dual union all
select '10.1.' from dual union all
select '10.1.1.' from dual union all
select '10.1.2.' from dual union all
select '10.1.3.' from dual union all
select '10.2.' from dual union all
select '10.3.' from dual union all
select '10.4.' from dual union all
select '10.4.1.' from dual union all
select '10.4.2.' from dual union all
select '10.4.3.' from dual union all
select '10.5.' from dual union all
select '10.5.1.' from dual union all
select '10.5.2.' from dual union all
select '10.5.3.' from dual union all
select '10.5.4.' from dual union all
select '10.6.' from dual



Нужно вставить новый узел в произвольное место. Если кто-то решал такую задачу, то поделитесь, пожалуйста, решением.
...
Рейтинг: 0 / 0
21.12.2020, 11:27
    #40029666
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в дерево
Pastic

Нужно вставить новый узел в произвольное место. Если кто-то решал такую задачу, то поделитесь, пожалуйста, решением.

Ставишь курсор на конец строки, нажимаешь клавишу ENTER и печатаешь свою строку.
...
Рейтинг: 0 / 0
21.12.2020, 11:36
    #40029669
Pastic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в дерево
AlexFF__|
Pastic

Нужно вставить новый узел в произвольное место. Если кто-то решал такую задачу, то поделитесь, пожалуйста, решением.

Ставишь курсор на конец строки, нажимаешь клавишу ENTER и печатаешь свою строку.


Там ещё нужно менять нумерацию сдвигаемых узлов.
...
Рейтинг: 0 / 0
21.12.2020, 11:38
    #40029671
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в дерево
AlexFF__|,

имхо

напр вставить после 8.2

8.3 станет 8.4
8.4 станет 8.5
8.5 станет 8.6
и тд

зы
готового нет
update .. like ... and >=

.....
stax
...
Рейтинг: 0 / 0
21.12.2020, 11:59
    #40029677
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в дерево
Pastic
Нужно вставить новый узел в произвольное место

Например, для приведённого набора, что это означает для узла
Код: plsql
1.
select '10.8.16.255' from dual 


?
...
Рейтинг: 0 / 0
21.12.2020, 12:00
    #40029679
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в дерево
т.е. надо ли дополнительно к нему добавлять узлы 1.7, 1.8, 1.8.1 .. 1.8.16, 1.8.16.1 .. 1.8.16.254 ?
...
Рейтинг: 0 / 0
21.12.2020, 12:11
    #40029680
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в дерево
Stax
AlexFF__|,

имхо

напр вставить после 8.2

8.3 станет 8.4
8.4 станет 8.5
8.5 станет 8.6
и тд

зы
готового нет
update .. like ... and >=

.....
stax

Зачем?
Надо вставить между 8.2 и 8.2.1 => вставляешь 8.2.0.1
...
Рейтинг: 0 / 0
21.12.2020, 12:16
    #40029682
Pastic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в дерево
env
т.е. надо ли дополнительно к нему добавлять узлы 1.7, 1.8, 1.8.1 .. 1.8.16, 1.8.16.1 .. 1.8.16.254 ?


Нет. Задача ставится так: вставляется узел вместо текущего. При этом нумерация текущего узла и нижележащих сдвигается. То есть, например, на место 7.5 вставляется новый узел. Тогда старый 7.5 становится 7.6 и т.д.

А при добавлении нового узла внизу нумерация проставляется автоматически на том же уровне. То есть, если надо вставить 10.7, то этот узел вставляется на том уровне, где находится 10.6, а если надо добавить узел 11, то он вставляется на том уровне, где находится узел 10.
...
Рейтинг: 0 / 0
21.12.2020, 12:34
    #40029691
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в дерево
Pastic,

Переходите на хранение иерархии в структуре parent-child, тогда задача упрощается на порядок.
...
Рейтинг: 0 / 0
21.12.2020, 15:37
    #40029772
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в дерево
Pastic

Нужно вставить новый узел в произвольное место. Если кто-то решал такую задачу, то поделитесь, пожалуйста, решением.


Что-то типа:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
with t1 as (
            select '&branch' branch from dual
           ),
     t2 as (
            select  substr(
                           branch,
                           1,
                           instr(branch,'.',-1,2)
                          ) parent_path,
                    to_number(
                              substr(
                                     branch,
                                     instr(branch,'.',-1,2) + 1
                                    )
                             ) node,
                    length(branch) - length(replace(branch,'.')) lvl
              from  t1
           )
 select  code old_code,
         case
           when code like parent_path ||'%'
             then case
                    when to_number(
                                   substr(
                                          substr(code,nvl(length(parent_path),0) + 1),
                                          1,
                                          instr(substr(code,nvl(length(parent_path),0) + 1),'.') - 1
                                         )
                                  ) >= node
                      then parent_path || (
                                           to_number(
                                                     substr(
                                                            substr(code,nvl(length(parent_path),0) + 1),
                                                            1,
                                                            instr(substr(code,nvl(length(parent_path),0) + 1),'.') - 1
                                                           )
                                                    ) + 1
                                          ) || substr(
                                                      code,
                                                      instr(code,'.',1,lvl)
                                                     )
                    else code
                  end
           else code
         end code
   from  tree,
         t2
union all
 select  null old_code,
         branch
   from  t1
/



Если производительность не так важна то можно упростить используя regexp_substr вместо substr/instr. Результаты:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
Enter value for branch: 7.5.
old   2:             select '&branch' branch from dual
new   2:             select '7.5.' branch from dual

OLD_CODE   CODE
---------- ----------
1.         1.
1.1.       1.1.
1.2.       1.2.
1.3.       1.3.
1.3.1.     1.3.1.
1.3.1.1.   1.3.1.1.
1.3.1.2.   1.3.1.2.
1.3.2.     1.3.2.
1.3.3.     1.3.3.
1.4.       1.4.
1.5.       1.5.
1.6.       1.6.
1.7.       1.7.
2.         2.
2.1.       2.1.
2.1.1.     2.1.1.
2.1.2.     2.1.2.
2.1.3.     2.1.3.
2.2.       2.2.
2.2.1.     2.2.1.
2.2.2.     2.2.2.
2.3.       2.3.
2.4.       2.4.
2.5.       2.5.
2.6.       2.6.
2.7.       2.7.
2.8.       2.8.
2.8.1.     2.8.1.
2.8.2.     2.8.2.
2.8.3.     2.8.3.
2.9.       2.9.
2.9.1.     2.9.1.
2.9.2.     2.9.2.
2.9.3.     2.9.3.
2.9.4.     2.9.4.
2.9.5.     2.9.5.
2.10.      2.10.
2.10.1.    2.10.1.
2.10.2.    2.10.2.
2.10.3.    2.10.3.
2.10.4.    2.10.4.
2.11.      2.11.
3.         3.
3.1.       3.1.
3.1.1.     3.1.1.
3.1.2.     3.1.2.
3.1.3.     3.1.3.
3.1.4.     3.1.4.
3.1.5.     3.1.5.
3.1.6.     3.1.6.
3.1.7.     3.1.7.
3.1.8.     3.1.8.
3.2.       3.2.
3.2.1.     3.2.1.
3.2.1.1.   3.2.1.1.
3.2.1.2.   3.2.1.2.
3.2.1.3.   3.2.1.3.
3.2.1.4.   3.2.1.4.
3.2.1.5.   3.2.1.5.
3.2.1.6.   3.2.1.6.
3.2.2.     3.2.2.
3.2.2.1.   3.2.2.1.
3.2.2.2.   3.2.2.2.
3.2.2.3.   3.2.2.3.
3.2.2.4.   3.2.2.4.
3.2.2.5.   3.2.2.5.
3.2.3.     3.2.3.
3.2.4.     3.2.4.
3.2.5.     3.2.5.
3.2.6.     3.2.6.
3.2.7.     3.2.7.
3.2.8.     3.2.8.
3.2.9.     3.2.9.
3.2.10.    3.2.10.
3.2.11.    3.2.11.
3.2.12.    3.2.12.
3.2.12.1.  3.2.12.1.
3.2.12.2.  3.2.12.2.
3.2.12.3.  3.2.12.3.
3.2.12.4.  3.2.12.4.
3.2.12.5.  3.2.12.5.
3.2.12.6.  3.2.12.6.
3.2.12.7.  3.2.12.7.
3.2.12.8.  3.2.12.8.
3.2.13.    3.2.13.
3.2.14.    3.2.14.
3.2.15.    3.2.15.
3.2.16.    3.2.16.
4.         4.
4.1.       4.1.
4.2.       4.2.
4.3.       4.3.
4.4.       4.4.
4.5.       4.5.
4.6.       4.6.
5.         5.
5.1.       5.1.
5.1.1.     5.1.1.
5.1.2.     5.1.2.
5.1.3.     5.1.3.
5.1.4.     5.1.4.
5.1.5.     5.1.5.
5.2.       5.2.
5.2.1.     5.2.1.
5.2.2.     5.2.2.
5.2.3.     5.2.3.
5.2.4.     5.2.4.
5.3.       5.3.
5.3.1.     5.3.1.
5.3.2.     5.3.2.
5.4.       5.4.
5.4.1.     5.4.1.
5.4.2.     5.4.2.
5.5.       5.5.
6.         6.
6.1.       6.1.
6.2.       6.2.
6.3.       6.3.
6.3.1.     6.3.1.
6.3.2.     6.3.2.
6.3.3.     6.3.3.
6.3.4.     6.3.4.
6.3.5.     6.3.5.
6.4.       6.4.
6.4.1.     6.4.1.
6.4.2.     6.4.2.
6.4.3.     6.4.3.
6.5.       6.5.
6.6.       6.6.
7.         7.
7.1.       7.1.
7.1.1.     7.1.1.
7.1.2.     7.1.2.
7.2.       7.2.
7.2.1.     7.2.1.
7.2.2.     7.2.2.
7.3.       7.3.
7.4.       7.4.
7.4.1.     7.4.1.
7.4.2.     7.4.2.
7.5.       7.6.
7.6.       7.7.
8.         8.
8.1.       8.1.
8.1.1.     8.1.1.
8.1.2.     8.1.2.
8.1.2.1.   8.1.2.1.
8.1.2.2.   8.1.2.2.
8.1.3.     8.1.3.
8.1.4.     8.1.4.
8.2.       8.2.
8.2.1.     8.2.1.
8.2.2.     8.2.2.
8.2.2.1.   8.2.2.1.
8.2.2.2.   8.2.2.2.
8.2.2.3.   8.2.2.3.
8.2.3.     8.2.3.
8.2.4.     8.2.4.
8.2.5.     8.2.5.
8.3.       8.3.
8.3.1.     8.3.1.
8.3.2.     8.3.2.
8.3.3.     8.3.3.
8.3.4.     8.3.4.
8.4.       8.4.
9.         9.
9.1.       9.1.
9.2.       9.2.
9.3.       9.3.
9.4.       9.4.
9.5.       9.5.
9.6.       9.6.
10.        10.
10.1.      10.1.
10.1.1.    10.1.1.
10.1.2.    10.1.2.
10.1.3.    10.1.3.
10.2.      10.2.
10.3.      10.3.
10.4.      10.4.
10.4.1.    10.4.1.
10.4.2.    10.4.2.
10.4.3.    10.4.3.
10.5.      10.5.
10.5.1.    10.5.1.
10.5.2.    10.5.2.
10.5.3.    10.5.3.
10.5.4.    10.5.4.
10.6.      10.6.
           7.5.

190 rows selected.

Elapsed: 00:00:00.02
SQL> /
Enter value for branch: 8.
old   2:             select '&branch' branch from dual
new   2:             select '8.' branch from dual

OLD_CODE   CODE
---------- ----------
1.         1.
1.1.       1.1.
1.2.       1.2.
1.3.       1.3.
1.3.1.     1.3.1.
1.3.1.1.   1.3.1.1.
1.3.1.2.   1.3.1.2.
1.3.2.     1.3.2.
1.3.3.     1.3.3.
1.4.       1.4.
1.5.       1.5.
1.6.       1.6.
1.7.       1.7.
2.         2.
2.1.       2.1.
2.1.1.     2.1.1.
2.1.2.     2.1.2.
2.1.3.     2.1.3.
2.2.       2.2.
2.2.1.     2.2.1.
2.2.2.     2.2.2.
2.3.       2.3.
2.4.       2.4.
2.5.       2.5.
2.6.       2.6.
2.7.       2.7.
2.8.       2.8.
2.8.1.     2.8.1.
2.8.2.     2.8.2.
2.8.3.     2.8.3.
2.9.       2.9.
2.9.1.     2.9.1.
2.9.2.     2.9.2.
2.9.3.     2.9.3.
2.9.4.     2.9.4.
2.9.5.     2.9.5.
2.10.      2.10.
2.10.1.    2.10.1.
2.10.2.    2.10.2.
2.10.3.    2.10.3.
2.10.4.    2.10.4.
2.11.      2.11.
3.         3.
3.1.       3.1.
3.1.1.     3.1.1.
3.1.2.     3.1.2.
3.1.3.     3.1.3.
3.1.4.     3.1.4.
3.1.5.     3.1.5.
3.1.6.     3.1.6.
3.1.7.     3.1.7.
3.1.8.     3.1.8.
3.2.       3.2.
3.2.1.     3.2.1.
3.2.1.1.   3.2.1.1.
3.2.1.2.   3.2.1.2.
3.2.1.3.   3.2.1.3.
3.2.1.4.   3.2.1.4.
3.2.1.5.   3.2.1.5.
3.2.1.6.   3.2.1.6.
3.2.2.     3.2.2.
3.2.2.1.   3.2.2.1.
3.2.2.2.   3.2.2.2.
3.2.2.3.   3.2.2.3.
3.2.2.4.   3.2.2.4.
3.2.2.5.   3.2.2.5.
3.2.3.     3.2.3.
3.2.4.     3.2.4.
3.2.5.     3.2.5.
3.2.6.     3.2.6.
3.2.7.     3.2.7.
3.2.8.     3.2.8.
3.2.9.     3.2.9.
3.2.10.    3.2.10.
3.2.11.    3.2.11.
3.2.12.    3.2.12.
3.2.12.1.  3.2.12.1.
3.2.12.2.  3.2.12.2.
3.2.12.3.  3.2.12.3.
3.2.12.4.  3.2.12.4.
3.2.12.5.  3.2.12.5.
3.2.12.6.  3.2.12.6.
3.2.12.7.  3.2.12.7.
3.2.12.8.  3.2.12.8.
3.2.13.    3.2.13.
3.2.14.    3.2.14.
3.2.15.    3.2.15.
3.2.16.    3.2.16.
4.         4.
4.1.       4.1.
4.2.       4.2.
4.3.       4.3.
4.4.       4.4.
4.5.       4.5.
4.6.       4.6.
5.         5.
5.1.       5.1.
5.1.1.     5.1.1.
5.1.2.     5.1.2.
5.1.3.     5.1.3.
5.1.4.     5.1.4.
5.1.5.     5.1.5.
5.2.       5.2.
5.2.1.     5.2.1.
5.2.2.     5.2.2.
5.2.3.     5.2.3.
5.2.4.     5.2.4.
5.3.       5.3.
5.3.1.     5.3.1.
5.3.2.     5.3.2.
5.4.       5.4.
5.4.1.     5.4.1.
5.4.2.     5.4.2.
5.5.       5.5.
6.         6.
6.1.       6.1.
6.2.       6.2.
6.3.       6.3.
6.3.1.     6.3.1.
6.3.2.     6.3.2.
6.3.3.     6.3.3.
6.3.4.     6.3.4.
6.3.5.     6.3.5.
6.4.       6.4.
6.4.1.     6.4.1.
6.4.2.     6.4.2.
6.4.3.     6.4.3.
6.5.       6.5.
6.6.       6.6.
7.         7.
7.1.       7.1.
7.1.1.     7.1.1.
7.1.2.     7.1.2.
7.2.       7.2.
7.2.1.     7.2.1.
7.2.2.     7.2.2.
7.3.       7.3.
7.4.       7.4.
7.4.1.     7.4.1.
7.4.2.     7.4.2.
7.5.       7.5.
7.6.       7.6.
8.         9.
8.1.       9.1.
8.1.1.     9.1.1.
8.1.2.     9.1.2.
8.1.2.1.   9.1.2.1.
8.1.2.2.   9.1.2.2.
8.1.3.     9.1.3.
8.1.4.     9.1.4.
8.2.       9.2.
8.2.1.     9.2.1.
8.2.2.     9.2.2.
8.2.2.1.   9.2.2.1.
8.2.2.2.   9.2.2.2.
8.2.2.3.   9.2.2.3.
8.2.3.     9.2.3.
8.2.4.     9.2.4.
8.2.5.     9.2.5.
8.3.       9.3.
8.3.1.     9.3.1.
8.3.2.     9.3.2.
8.3.3.     9.3.3.
8.3.4.     9.3.4.
8.4.       9.4.
9.         10.
9.1.       10.1.
9.2.       10.2.
9.3.       10.3.
9.4.       10.4.
9.5.       10.5.
9.6.       10.6.
10.        11.
10.1.      11.1.
10.1.1.    11.1.1.
10.1.2.    11.1.2.
10.1.3.    11.1.3.
10.2.      11.2.
10.3.      11.3.
10.4.      11.4.
10.4.1.    11.4.1.
10.4.2.    11.4.2.
10.4.3.    11.4.3.
10.5.      11.5.
10.5.1.    11.5.1.
10.5.2.    11.5.2.
10.5.3.    11.5.3.
10.5.4.    11.5.4.
10.6.      11.6.
           8.

190 rows selected.

Elapsed: 00:00:00.02
SQL>




SY.
...
Рейтинг: 0 / 0
21.12.2020, 15:51
    #40029783
Pastic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в дерево
SY, большое спасибо.

Вот так работает (с regexp_replace):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
with t1 as (
            select '7.5' branch from dual
           ),
     t2 as (
            select  substr(
                           branch,
                           1,
                           instr(branch,'.',-1,2)
                          ) parent_path,
                    to_number(regexp_replace(
                              substr(
                                     branch,
                                     instr(branch,'.',-1,2) + 1
                                    )
                             , '\D')) node,
                    length(branch) - length(replace(branch,'.')) lvl
              from  t1
           ),
     tree as
     (select '1.' code from dual union all
select '1.1.' from dual union all
select '1.2.' from dual union all
select '1.3.' from dual union all
select '1.3.1.' from dual union all
select '1.3.1.1.' from dual union all
select '1.3.1.2.' from dual union all
select '1.3.2.' from dual union all
select '1.3.3.' from dual union all
select '1.4.' from dual union all
select '1.5.' from dual union all
select '1.6.' from dual union all
select '1.7.' from dual union all
select '2.' from dual union all
select '2.1.' from dual union all
select '2.1.1.' from dual union all
select '2.1.2.' from dual union all
select '2.1.3.' from dual union all
select '2.2.' from dual union all
select '2.2.1.' from dual union all
select '2.2.2.' from dual union all
select '2.3.' from dual union all
select '2.4.' from dual union all
select '2.5.' from dual union all
select '2.6.' from dual union all
select '2.7.' from dual union all
select '2.8.' from dual union all
select '2.8.1.' from dual union all
select '2.8.2.' from dual union all
select '2.8.3.' from dual union all
select '2.9.' from dual union all
select '2.9.1.' from dual union all
select '2.9.2.' from dual union all
select '2.9.3.' from dual union all
select '2.9.4.' from dual union all
select '2.9.5.' from dual union all
select '2.10.' from dual union all
select '2.10.1.' from dual union all
select '2.10.2.' from dual union all
select '2.10.3.' from dual union all
select '2.10.4.' from dual union all
select '2.11.' from dual union all
select '3.' from dual union all
select '3.1.' from dual union all
select '3.1.1.' from dual union all
select '3.1.2.' from dual union all
select '3.1.3.' from dual union all
select '3.1.4.' from dual union all
select '3.1.5.' from dual union all
select '3.1.6.' from dual union all
select '3.1.7.' from dual union all
select '3.1.8.' from dual union all
select '3.2.' from dual union all
select '3.2.1.' from dual union all
select '3.2.1.1.' from dual union all
select '3.2.1.2.' from dual union all
select '3.2.1.3.' from dual union all
select '3.2.1.4.' from dual union all
select '3.2.1.5.' from dual union all
select '3.2.1.6.' from dual union all
select '3.2.2.' from dual union all
select '3.2.2.1.' from dual union all
select '3.2.2.2.' from dual union all
select '3.2.2.3.' from dual union all
select '3.2.2.4.' from dual union all
select '3.2.2.5.' from dual union all
select '3.2.3.' from dual union all
select '3.2.4.' from dual union all
select '3.2.5.' from dual union all
select '3.2.6.' from dual union all
select '3.2.7.' from dual union all
select '3.2.8.' from dual union all
select '3.2.9.' from dual union all
select '3.2.10.' from dual union all
select '3.2.11.' from dual union all
select '3.2.12.' from dual union all
select '3.2.12.1.' from dual union all
select '3.2.12.2.' from dual union all
select '3.2.12.3.' from dual union all
select '3.2.12.4.' from dual union all
select '3.2.12.5.' from dual union all
select '3.2.12.6.' from dual union all
select '3.2.12.7.' from dual union all
select '3.2.12.8.' from dual union all
select '3.2.13.' from dual union all
select '3.2.14.' from dual union all
select '3.2.15.' from dual union all
select '3.2.16.' from dual union all
select '4.' from dual union all
select '4.1.' from dual union all
select '4.2.' from dual union all
select '4.3.' from dual union all
select '4.4.' from dual union all
select '4.5.' from dual union all
select '4.6.' from dual union all
select '5.' from dual union all
select '5.1.' from dual union all
select '5.1.1.' from dual union all
select '5.1.2.' from dual union all
select '5.1.3.' from dual union all
select '5.1.4.' from dual union all
select '5.1.5.' from dual union all
select '5.2.' from dual union all
select '5.2.1.' from dual union all
select '5.2.2.' from dual union all
select '5.2.3.' from dual union all
select '5.2.4.' from dual union all
select '5.3.' from dual union all
select '5.3.1.' from dual union all
select '5.3.2.' from dual union all
select '5.4.' from dual union all
select '5.4.1.' from dual union all
select '5.4.2.' from dual union all
select '5.5.' from dual union all
select '6.' from dual union all
select '6.1.' from dual union all
select '6.2.' from dual union all
select '6.3.' from dual union all
select '6.3.1.' from dual union all
select '6.3.2.' from dual union all
select '6.3.3.' from dual union all
select '6.3.4.' from dual union all
select '6.3.5.' from dual union all
select '6.4.' from dual union all
select '6.4.1.' from dual union all
select '6.4.2.' from dual union all
select '6.4.3.' from dual union all
select '6.5.' from dual union all
select '6.6.' from dual union all
select '7.' from dual union all
select '7.1.' from dual union all
select '7.1.1.' from dual union all
select '7.1.2.' from dual union all
select '7.2.' from dual union all
select '7.2.1.' from dual union all
select '7.2.2.' from dual union all
select '7.3.' from dual union all
select '7.4.' from dual union all
select '7.4.1.' from dual union all
select '7.4.2.' from dual union all
select '7.5.' from dual union all
select '7.6.' from dual union all
select '8.' from dual union all
select '8.1.' from dual union all
select '8.1.1.' from dual union all
select '8.1.2.' from dual union all
select '8.1.2.1.' from dual union all
select '8.1.2.2.' from dual union all
select '8.1.3.' from dual union all
select '8.1.4.' from dual union all
select '8.2.' from dual union all
select '8.2.1.' from dual union all
select '8.2.2.' from dual union all
select '8.2.2.1.' from dual union all
select '8.2.2.2.' from dual union all
select '8.2.2.3.' from dual union all
select '8.2.3.' from dual union all
select '8.2.4.' from dual union all
select '8.2.5.' from dual union all
select '8.3.' from dual union all
select '8.3.1.' from dual union all
select '8.3.2.' from dual union all
select '8.3.3.' from dual union all
select '8.3.4.' from dual union all
select '8.4.' from dual union all
select '9.' from dual union all
select '9.1.' from dual union all
select '9.2.' from dual union all
select '9.3.' from dual union all
select '9.4.' from dual union all
select '9.5.' from dual union all
select '9.6.' from dual union all
select '10.' from dual union all
select '10.1.' from dual union all
select '10.1.1.' from dual union all
select '10.1.2.' from dual union all
select '10.1.3.' from dual union all
select '10.2.' from dual union all
select '10.3.' from dual union all
select '10.4.' from dual union all
select '10.4.1.' from dual union all
select '10.4.2.' from dual union all
select '10.4.3.' from dual union all
select '10.5.' from dual union all
select '10.5.1.' from dual union all
select '10.5.2.' from dual union all
select '10.5.3.' from dual union all
select '10.5.4.' from dual union all
select '10.6.' from dual)
 select  code old_code,
         case
           when code like parent_path ||'%'
             then case
                    when to_number(regexp_replace(
                                   substr(
                                          substr(code,nvl(length(parent_path),0) + 1),
                                          1,
                                          instr(substr(code,nvl(length(parent_path),0) + 1),'.') - 1
                                         )
                                  , '\D')) >= node
                      then parent_path || (
                                           to_number(regexp_replace(
                                                     substr(
                                                            substr(code,nvl(length(parent_path),0) + 1),
                                                            1,
                                                            instr(substr(code,nvl(length(parent_path),0) + 1),'.') - 1
                                                           )
                                                    , '\D')) + 1
                                          ) || substr(
                                                      code,
                                                      instr(code,'.',1,lvl)
                                                     )
                    else code
                  end
           else code
         end code
   from  tree,
         t2
union all
 select  null old_code,
         branch
   from  t1
...
Рейтинг: 0 / 0
21.12.2020, 16:54
    #40029822
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка записи в дерево
Pastic


Вот так работает (с regexp_replace):


Сказав A скажи и Б:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
with t1 as (
            select '&branch' branch from dual
           ),
     t2 as (
            select  regexp_replace(
                                   branch,
                                   '\d+\.$'
                                  ) parent_path,
                    to_number(
                              regexp_substr(
                                            branch,
                                            '\d+\.$'
                                           )
                             ) node,
                    regexp_count(branch,'\.') lvl
              from  t1
           )
 select  code old_code,
         case
           when code like parent_path ||'%'
             then case
                    when to_number(
                                   regexp_substr(code,'\d+',nvl(length(parent_path),0) + 1)
                                  ) >= node
                      then parent_path || (
                                           to_number(
                                                     regexp_substr(code,'\d+',nvl(length(parent_path),0) + 1)
                                                    ) + 1
                                          ) || substr(
                                                      code,
                                                      instr(code,'.',1,lvl)
                                                     )
                    else code
                  end
           else code
         end code
   from  tree,
         t2
union all
 select  null old_code,
         branch
   from  t1
/



SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вставка записи в дерево / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]