Oracle sql. Связки записей из одной таблицы
Дано: table1 с атрибутами PARENT_ID(внешний ключ на table2.ID) и ID(также внешний ключ на table2.ID), table2 с атрибутами ID и NAME
Записи в table2 могут быть и родителями и потомками друг у друга.
к примеру в Table1 есть записи
| ID | PARENT_ID |
|---|---|
| 2 | 1 |
| 1 | 2 |
| 2 | 3 |
в Table2 есть записи
| ID | NAME |
|---|---|
| 1 | дерево |
| 2 | железо |
| 3 | пластик |
Необходим запрос, показывающий все пары наименований, по связкам в table1:
| NAME | NAME |
|---|---|
| железо | дерево |
| дерево | железо |
| железо | пластик |
Ответы (2 шт):
WITH
cte (parent_id, id) AS ( SELECT *
FROM table1
UNION ALL
SELECT cte.parent_id, table1.id
FROM cte
JOIN table1 ON cte.id = table1.parent_id
WHERE cte.parent_id <> table1.id )
SELECT t21.name, t22.name
FROM cte
JOIN table2 t21 ON cte.parent_id = t21.id
JOIN table2 t22 ON cte.id = t22.id;
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=48e9fedce1121e34880792c8e7e76bed
Получить все пары наименований по связям в таблице можно стандартным запросом:
select t1.*, t20.name rootname, t21.name, t22.name pname
from (
select level lvl, connect_by_root id root, sys_connect_by_path (id, '/') path, t1.*
from t1 connect by nocycle prior id = parent_id) t1
join t2 t20 on t20.id = t1.root
join t2 t21 on t21.id = t1.id
join t2 t22 on t22.id = t1.parent_id
На данных из вопроса будет получен результат (db<>fiddle):
LVL ROOT PATH ID PARENT_ID ROOTNAME NAME PNAME
--- ---- -------- ---------- ---------- -------- -------- --------
1 2 /2 2 3 железо железо пластик
2 2 /2/1 1 2 железо дерево железо
2 2 /2/1 1 2 железо дерево железо
1 1 /1 1 2 дерево дерево железо
1 2 /2 2 1 железо железо дерево
2 1 /1/2 2 1 дерево железо дерево
Он содержит корень и путь для каждой пары значений. Остаётся выбрать, какие из них соответствуют бизнес требованию и как должен выглядеть конечный результат.