Чтобы дать более конкретный ответ на ваш вопрос, я должен бы знать структуру вашей базы данных и текущий запрос, который вы используете, потому что в разных ситуациях могут требоваться разные решения.
Тем не менее, я могу предложить общий подход для написания эффективного рекурсивного запроса для подсчета количества потомков в иерархических данных, например, для древовидной структуры или графа с отношениями родитель-потомок.
Вот пример рекурсивного запроса с использованием общетабличных выражений (CTE) в SQL, который может рассчитать количество потомков для каждой вершины:
```sql
WITH RECURSIVE Descendants AS (
SELECT
id,
parent_id,
1 AS depth -- начинаем с глубины 1
FROM
your_table
WHERE
parent_id IS NULL -- или ваш специфический ID для корневого элемента
UNION ALL
SELECT
child.id,
child.parent_id,
parent.depth + 1
FROM
your_table AS child
JOIN
Descendants AS parent
ON child.parent_id = parent.id -- соединение с родителем
),
DescendantCounts AS (
SELECT
parent_id,
COUNT(*) AS c_count
FROM
Descendants
GROUP BY
parent_id
)
SELECT
your_table.id,
COALESCE(DescendantCounts.c_count, 0) AS c_count
FROM
your_table
LEFT JOIN
DescendantCounts
ON your_table.id = DescendantCounts.parent_id;
```
Этот запрос включает следующие шаги:
1. Определение рекурсивного CTE `Descendants`, который находит всех потомков для каждого элемента.
2. Создание дополнительного CTE `DescendantCounts`, который подсчитывает количество потомков для каждого родителя (`parent_id`).
3. Выборка из исходной таблицы с присоединением подсчитанных значений из `DescendantCounts`. Используется `LEFT JOIN` для включения в результаты строк, у которых нет потомков (иначе они были бы исключены из выборки, если использовать только `JOIN`).
Важно отметить, что для конкретных СУБД могут потребоваться некоторые специфические изменения в запросе, так как синтаксис и функционал могут отличаться. Также возможно, вам придется оптимизировать запрос под конкретную структуру ваших данных или добавить индексы для ускорения выполнения.
Если вам нужна более точная помощь, пожалуйста, предоставьте текущий SQL-запрос и структуру таблицы, с которой вы работаете.