Рекурсивный самозапрос в Postgres/PADB без CTE

Я использую PADB/Postgres, в котором отсутствуют рекурсивные CTE. Я пытаюсь найти способ написать рекурсивное самосоединение, используя только обычные соединения/объединения без рекурсивных CTE. Каков самый простой способ сделать это?

У меня есть такая таблица:

PersonID | Initials | ParentID
1          CJ         NULL
2          EB         1
3          MB         1
4          SW         2
5          YT         NULL
6          IS         5

И я хочу иметь возможность получать записи, относящиеся только к иерархии, начиная с конкретного человека. Итак, если бы я запросил иерархию CJ по PersonID = 1, я бы получил:

PersonID | Initials | ParentID
1          CJ         NULL
2          EB         1
3          MB         1
4          SW         2

И для EB я бы получил:

PersonID | Initials | ParentID
2          EB         1
4          SW         2

person laconicdev    schedule 06.08.2015    source источник
comment
Что это за штука с PADB?   -  person a_horse_with_no_name    schedule 06.08.2015
comment
Это продукт компании actian (actian.com), предназначенный для обработки больших данных. Он основан на версии Postgres sql, но лишен некоторых его функций.   -  person laconicdev    schedule 06.08.2015
comment
вместо того, чтобы отрицать ответы без комментариев, вы должны предоставить больше информации о вопросе, который у вас есть. например, вообще не указано, что нельзя использовать процедуры или функции   -  person Zsuzsa    schedule 06.08.2015


Ответы (1)


Это самое простое решение, которое я могу придумать.

select * from t where personid = '1' --needs replacement with personid you run for
union
select * from t where personid in (select personid from t where parentid = '1')
or parentid in (select personid from t where parentid = '1')

Personid нуждается в замене человеком, для которого вам нужно увидеть иерархию.

Скрипт SQL: http://sqlfiddle.com/#!15/f1201/1

person Vamsi Prabhala    schedule 06.08.2015
comment
Он охватывает 3 уровня, но не будет работать, если у вас есть 4-й уровень. Например, если вы добавите 7-ю строку в свою таблицу, PersonID = 7, Inistials = 'AA', ParentID = 4. - person Zsuzsa; 06.08.2015