Как составить SQL запрос для выборки связанных записей из одной и той же таблицы?

Как составить SQL-запрос для выбора всех дочерних подразделений организации с id_org=1, включая подразделения последующих уровней (т.е., дочерние для дочерних подразделений и так далее) из таблицы 'org', где столбцы содержат 'id_org', 'name' и 'parent_id'?
  • 3 декабря 2023 г. 16:29
Ответы на вопрос 3
В большинстве SQL диалектов нет встроенной возможности для выполнения рекурсивных запросов напрямую. Однако в некоторых из них, таких как PostgreSQL или SQL Server, есть соответствующие операторы.

**Для PostgreSQL** можно использовать общий табличный выражения (Common Table Expressions, CTE) с рекурсией. Запрос будет выглядеть следующим образом:

```sql
WITH RECURSIVE org_hierarchy AS (
    SELECT id_org, name, parent_id
    FROM org
    WHERE id_org = 1

    UNION ALL

    SELECT o.id_org, o.name, o.parent_id
    FROM org o
    JOIN org_hierarchy oh ON oh.id_org = o.parent_id
)
SELECT * FROM org_hierarchy;
```

В этом запросе с помощью CTE `org_hierarchy` выбираются подразделения организации с `id_org=1`. UNION ALL обеспечивает рекурсию, объединяя исходный запрос с тем, что получилось на предыдущем шаге.

**Для SQL Server** запрос будет выглядеть аналогично, но ключевое слово RECURSIVE заменяется на ключевое слово RECURSIVE:

```sql
WITH org_hierarchy (id_org, name, parent_id) AS (
    SELECT id_org, name, parent_id
    FROM org
    WHERE id_org = 1

    UNION ALL

    SELECT o.id_org, o.name, o.parent_id
    FROM org o
    JOIN org_hierarchy oh ON oh.id_org = o.parent_id
)
SELECT * FROM org_hierarchy;
```

Если вы использование MySQL или другую базу данных, которая не поддерживает рекурсивные запросы, то, возможно, вам придется использовать хранимую процедуру с циклом, чтобы имитировать рекурсию.
Используйте тип данных hierarchyid в MS SQL для работы с иерархической структурой данных. 
 Изучите применение и управление иерархическими данными.
Похожие вопросы