powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / замена всех ID в иерархии одним запросом
7 сообщений из 7, страница 1 из 1
замена всех ID в иерархии одним запросом
    #39372323
connect by
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос из праздного любопытства, задачу можно решить многими другими способами. Но поломав голову так и не придумал, как можно одним запросом вытащить всю иерархию записей из таблицы и заменить все ID на значения из сиквенса
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select 
 id, 
 seq.nextval as new_id, 
 parent, 
 prior new_id as new_parent,
 name
from clf
start with parent is null
connect by prior id = parent


Понятно, что нельзя сослаться на new_id, но хотелось бы что-нибудь подобное. Можно ли вообще это сделать одним запросом?
...
Рейтинг: 0 / 0
замена всех ID в иерархии одним запросом
    #39372389
Не понятно
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
connect by,

Не до конца понятна задача.
Нужно в иерархии просто поменять идишники?
Если так, то update по всем строкам, где будут замены. В предложении set (id, parent_id) = (with ... select new_id, new_parent_id ... where old_id = id).
...
Рейтинг: 0 / 0
замена всех ID в иерархии одним запросом
    #39372398
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
connect by, с временной таблицей...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
with Hierarchy as 
(
  select id, parent_id, schema.new_id_from_sqn as new_id 
    from ... connect by ...   
) 
select new_id, (select new_id from Hierahi h where h.id = h2.parent_id) as new_parent_id
  from Hierarchy h2 
...
Рейтинг: 0 / 0
замена всех ID в иерархии одним запросом
    #39372647
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ma1tus,
нерабочий говнокод. думай прежде чем что-то писать.


connect by,
не вполне понятно зачем именно из сиквенса,но на небольшом количестве значений:
Код: plsql
1.
2.
3.
4.
5.
select id, parent,
 seq.nextval as new_id
bulk collect into collection
----
merge .... (select id,parent,new_id,prior new_id from collection connect by...)....
...
Рейтинг: 0 / 0
замена всех ID в иерархии одним запросом
    #39372674
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintma1tus,
нерабочий говнокод. думай прежде чем что-то писать.точно, да)
...
Рейтинг: 0 / 0
замена всех ID в иерархии одним запросом
    #39373041
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из сиквенса врядли, ибо нарвешься на ORA-02287: sequence number not allowed here.
А если просто с единицы:

Код: 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.
SQL> select  empno,
  2          ename,
  3          job,
  4          sal,
  5          mgr
  6    from  emp
  7    start with mgr is null
  8    connect by mgr = prior empno
  9  /

     EMPNO ENAME   JOB         SAL   MGR
---------- ------- --------- ----- -----
      7839 KING    PRESIDENT  5000
      7566 JONES   MANAGER    2975  7839
      7788 SCOTT   ANALYST    3000  7566
      7876 ADAMS   CLERK      1100  7788
      7902 FORD    ANALYST    3000  7566
      7369 SMITH   CLERK       800  7902
      7698 BLAKE   MANAGER    2850  7839
      7499 ALLEN   SALESMAN   1600  7698
      7521 WARD    SALESMAN   1250  7698
      7654 MARTIN  SALESMAN   1250  7698
      7844 TURNER  SALESMAN   1500  7698

     EMPNO ENAME   JOB         SAL   MGR
---------- ------- --------- ----- -----
      7900 JAMES   CLERK       950  7698
      7782 CLARK   MANAGER    2450  7839
      7934 MILLER  CLERK      1300  7782

14 rows selected.

SQL> with t as (
  2             select  empno,
  3                     ename,
  4                     job,
  5                     sal,
  6                     mgr,
  7                     rownum emp_rn
  8               from  emp
  9               start with mgr is null
 10               connect by mgr = prior empno
 11            ),
 12       x as (
 13             select  t2.emp_rn empno,
 14                     t2.ename,
 15                     t2.job,
 16                     t2.sal,
 17                     t1.emp_rn mgr
 18               from  t t1,
 19                     t t2
 20               where t2.mgr = t1.empno(+)
 21            )
 22  select  empno,
 23          ename,
 24          job,
 25          sal,
 26          mgr
 27    from  x
 28    order by empno
 29  /

     EMPNO ENAME   JOB         SAL   MGR
---------- ------- --------- ----- -----
         1 KING    PRESIDENT  5000
         2 JONES   MANAGER    2975     1
         3 SCOTT   ANALYST    3000     2
         4 ADAMS   CLERK      1100     3
         5 FORD    ANALYST    3000     2
         6 SMITH   CLERK       800     5
         7 BLAKE   MANAGER    2850     1
         8 ALLEN   SALESMAN   1600     7
         9 WARD    SALESMAN   1250     7
        10 MARTIN  SALESMAN   1250     7
        11 TURNER  SALESMAN   1500     7

     EMPNO ENAME   JOB         SAL   MGR
---------- ------- --------- ----- -----
        12 JAMES   CLERK       950     7
        13 CLARK   MANAGER    2450     1
        14 MILLER  CLERK      1300    13

14 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
замена всех ID в иерархии одним запросом
    #39373058
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYА если просто с единицы:Единственный раз, когда моделька пригодилась мне не на побаловаться:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select * from some_tree
  model
    dimension by (id)
    measures
    ( row_number() over (order by id) as id2
    , 0 as parent_id2
    , parent_id
    )
    rules
    ( parent_id2[any] = nvl(id2[parent_id[cv()]], 0)
    )
;
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / замена всех ID в иерархии одним запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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