#postgresql
Вопрос:
Можно ли получить доступ к псевдониму внешних запросов parent_id, который берется из пользовательской функции postgres, написанной для обхода дерева, внутри внутреннего подзапроса.
select
i.id,
unnest(array_agg(traversal.id)) as parent_id,
(select item_type from items i_2 where i_2.id = parent_id) as item_type
from
items i
cross join
link_traversal(start_node, depth) as traversal
where
si.id in [ids] and
item_type in [types]
group by
si.id;
запуск вышеупомянутого sql выдает ошибку:
column "parent_id" does not exist
Комментарии:
1. parent_id-это псевдоним здесь. поэтому его нельзя использовать в подзапросе corelated в качестве столбца таблицы.
2. @RahulBiswas Возможно ли ссылаться на агрегацию внутри подзапроса? Идея заключается в том, что для каждого неназначенного идентификатора parent_id я хочу найти соответствующий тип item_type в таблице элементов
3. пожалуйста, предоставьте образец ввода со структурой таблицы и ожидаемым результатом.
Ответ №1:
Пока вы все равно используете postgres, вам на самом деле не нужна хранимая процедура или какой-то сложный индекс для извлечения рекурсивной связи. Просто используйте рекурсивное общее табличное выражение
WITH RETURSIVE recurse AS (
SELECT parent_id, id, 0 AS depth FROM items WHERE id = :start_node_id:
UNION ALL
SELECT i.parent_id, i.id, r.depth 1 AS depth
FROM items i
JOIN recurse r
ON i.parent_id = r.id
HAVING depth < :max_depth:
) SELECT i.* FROM recurse r JOIN items i ON i.id = r.id;