Освоение иерархических SQL-запросов: подробное руководство с примерами кода

Иерархические запросы SQL необходимы при работе с древовидными структурами или иерархическими данными в реляционных базах данных. Эти запросы позволяют просматривать отношения родитель-потомок и выполнять такие операции, как получение иерархических данных, вычисление уровней, поиск предков или потомков и многое другое. В этой статье мы рассмотрим различные методы обработки иерархических запросов SQL, а также примеры кода в популярных системах баз данных, таких как SQL Server, PostgreSQL и Oracle.

Метод 1: использование рекурсивных запросов (общие табличные выражения – CTE)
Пример кода (SQL Server):

WITH RecursiveCTE AS (
    SELECT Id, Name, ParentId, 1 AS Level
    FROM YourTable
    WHERE ParentId IS NULL -- Root nodes

    UNION ALL

    SELECT t.Id, t.Name, t.ParentId, rc.Level + 1
    FROM YourTable t
    INNER JOIN RecursiveCTE rc ON t.ParentId = rc.Id
)
SELECT Id, Name, Level
FROM RecursiveCTE
ORDER BY Level, Id;

Метод 2: использование предложения CONNECT BY (Oracle)
Пример кода (Oracle):

SELECT Id, Name, LEVEL
FROM YourTable
START WITH ParentId IS NULL -- Root nodes
CONNECT BY PRIOR Id = ParentId
ORDER SIBLINGS BY Id;

Метод 3: использование рекурсивных запросов (PostgreSQL – С РЕКУРСИВОЙ)
Пример кода (PostgreSQL):

WITH RECURSIVE RecursiveCTE AS (
    SELECT Id, Name, ParentId, 1 AS Level
    FROM YourTable
    WHERE ParentId IS NULL -- Root nodes

    UNION ALL

    SELECT t.Id, t.Name, t.ParentId, rc.Level + 1
    FROM YourTable t
    INNER JOIN RecursiveCTE rc ON t.ParentId = rc.Id
)
SELECT Id, Name, Level
FROM RecursiveCTE
ORDER BY Level, Id;

Метод 4: использование материализованного пути
Пример кода:
Предположим, у вас есть «YourTable» со столбцами «Id», «Name» и «Path», где «Path» хранит материализованное представление пути иерархическая структура.

SELECT Id, Name, 
       (LENGTH(Path) - LENGTH(REPLACE(Path, '/', ''))) AS Level
FROM YourTable
ORDER BY Path;

Метод 5: использование модели вложенных множеств
Пример кода:
Предположим, у вас есть «YourTable» со столбцами «Id», «Name», «LeftValue» и «RightValue», где «LeftValue» и «RightValue». “RightValue” представляет собой вложенные значения набора.

SELECT Id, Name, 
       (COUNT(parent.Id) - 1) AS Level
FROM YourTable AS node,
     YourTable AS parent
WHERE node.LeftValue BETWEEN parent.LeftValue AND parent.RightValue
GROUP BY node.Id, node.Name
ORDER BY node.LeftValue;

Иерархические запросы SQL предоставляют мощные средства для работы с древовидными структурами в реляционных базах данных. В этой статье мы рассмотрели пять различных методов с примерами кода, включая рекурсивные запросы с общими табличными выражениями (CTE) в SQL Server и PostgreSQL, предложение CONNECT BY в Oracle, подход материализованного пути и модель вложенных наборов. Используя эти методы, вы можете эффективно перемещаться по иерархическим данным и манипулировать ими в SQL-запросах, открывая двери для широкого спектра приложений.