Как получить потомков в таблице с parent_case_id

Используйте рекурсивный CTE. Для выбранных полей UNION удаляет повторные строки и не даёт одному циклу бесконечно добавлять те же узлы.

Короткий ответ

Что ответить на собеседовании

Используйте рекурсивный CTE. Для выбранных полей UNION удаляет повторные строки и не даёт одному циклу бесконечно добавлять те же узлы.

Подробный разбор

Ответ с пояснениями

Условие

В PostgreSQL таблица cases(case_id PRIMARY KEY, parent_case_id REFERENCES cases). Найдите узел $1 и всех его потомков. Учтите, что внешний ключ сам по себе не запрещает циклы.

Ответ

Используйте рекурсивный CTE. Для выбранных полей UNION удаляет повторные строки и не даёт одному циклу бесконечно добавлять те же узлы.

Пример:

WITH RECURSIVE tree AS (
  SELECT case_id, parent_case_id FROM cases WHERE case_id = $1
  UNION
  SELECT c.case_id, c.parent_case_id
  FROM cases c JOIN tree t ON c.parent_case_id = t.case_id
)
SELECT * FROM tree;

Индекс parent_case_id полезен для поиска детей. Если добавлять depth или path, строки на цикле уже различаются: потребуется явное отслеживание посещённых узлов.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее