Иерархический множественный запрос на обновление одной таблицы - оракул - PullRequest
0 голосов
/ 14 мая 2018

У меня есть таблица персона с этими столбцами, зависящими друг от друга.

person_id, related_person_id, beginner_related_person_id 

Пример моих данных

person_id related_person_id beginner_related_person_id 
1         null              null
2         1                 null
3         2                 null
4         null              null
5         4                 null 
6         null              null

Этот столбец beginner_related_person_id является новым и на данный момент пустым.

Я должен обновить эту строку значениями из person_id, но с корневым значением person_id.

person_id related_person_id beginner_related_person_id
1         null              null
2         1                 1
3         2                 1
4         null              null
5         4                 4 
6         null              null

Я начал писать запрос, но мне нужна подсказка.

update person
set beginner_related_person_id = person_id
where person_id in (select  distinct person_id from person start with  related_person_id in (select person_id from person)
  connect by prior beginner_person_id = person_id);

Должен ли я использовать петли? Или что-то еще?

1 Ответ

0 голосов
/ 14 мая 2018

Вы можете использовать оператор MERGE, чтобы сделать это довольно легко.

merge into person using (
select person_id, 
       related_person_id, 
       nullif(connect_by_root person_id, person_id) new_beginner_related_id
from   person
start with 
   related_person_id is null
connect by  
   related_person_id = prior person_id ) u
on ( t.person_id = u.person_id )
when matched then 
  update set 
     t.beginner_related_person_id = u.new_beginner_related_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...