У меня есть две таблицы:
create table person (
person_id number,
name varchar2(20)
);
insert into person (person_id, name) values (1, 'Dan');
insert into person (person_id, name) values (2, 'Tom');
insert into person (person_id, name) values (3, 'Tim');
insert into person (person_id, name) values (4, 'Bob');
insert into person (person_id, name) values (5, 'Pat');
insert into person (person_id, name) values (6, 'Ted');
create table person_merge (
person_id number,
person_merged_to_id number
);
insert into person_merge (person_id, person_merged_to_id) values (2, 3);
insert into person_merge (person_id, person_merged_to_id) values (3, 4);
insert into person_merge (person_id, person_merged_to_id) values (5, 6);
insert into person_merge (person_id, person_merged_to_id) values (6, 5);
Я хочу написать запрос или функцию, которая возьмет список person_ids и сопоставит их с кем бы они ни были в конечном итоге объединены, если они имеют. Я также хочу выдать ошибку, если происходит циклическое слияние.
map (1, 2, 3, 4) => (1, 4, 4, 4)
map (1, 2, 3, 4, 5) => cyclical merge error
Как я мог сделать это чисто? С CTE, CONNECT BY или рекурсивной функцией?