Postgres — псевдоним агрегированного поля ссылки в подзапросе

#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;