Рекурсия В Oracle
у меня есть следующая таблица в oracle:
Parent(arg1, arg2)
и я хочу транзитивное замыкание отношения родителей. То есть, я хочу следующую таблицу
Ancestor(arg1, arg2)
как это возможно в Oracle?
Я делаю следующее:
WITH Ancestor(arg1, arg2) AS (
SELECT p.arg1, p.arg2 from parent p
UNION
SELECT p.arg1 , a.arg2 from parent p, Ancestor a
WHERE p.arg2 = a.arg1
)
SELECT DISTINCT * FROM Ancestor;
Я получаю ошибку
*Cause: column aliasing in WITH clause is not supported yet
*Action: specify aliasing in defintion subquery and retry
Error at Line: 1 Column: 20
как я могу решить эту проблему без сглаживания столбцов?
2 ответов
WITH Ancestor(arg1, arg2) AS
(
SELECT p.arg1, p.arg2
FROM parent p
WHERE arg2 NOT IN
(
SELECT arg1
FROM parent
)
UNION ALL
SELECT p.arg1, a.arg2
FROM Ancestor a
JOIN parent p
ON p.arg2 = a.arg1
)
SELECT *
FROM Ancestor
Oracle
поддерживает только рекурсивные CTE
С 11g
релиз 2.
в более ранних версиях, используйте CONNECT BY
статья:
SELECT arg1, CONNECT_BY_ROOT arg2
FROM parent
START WITH
arg2 NOT IN
(
SELECT arg1
FROM parent
)
CONNECT BY
arg2 = PRIOR arg1
Oracle разрешает рекурсивные запросы. Смотри:http://www.adp-gmbh.ch/ora/sql/connect_by.html
конечно, они обычно предполагают, что иерархические данные находятся в одной таблице. Разделение его на отдельные таблицы усложняет дело.