Изменения документа Рекурсивный запрос

Редактировал(а) Alexandr Fokin 2023/12/16 14:12

От версии 5.1
отредактировано Alexandr Fokin
на 2022/03/19 13:16
Изменить комментарий: К данной версии нет комментариев
К версии 4.2
отредактировано Alexandr Fokin
на 2022/03/19 13:16
Изменить комментарий: Update document after refactoring.

Сводка

Подробности

Свойства страницы
Содержимое
... ... @@ -1,7 +3,50 @@
1 -Аналог MsSql: [[Рекурсивный запрос>>doc:Разработка.Базы данных.SQL.MSSQL.SQL запросы.Рекурсивный запрос.WebHome]]
2 -
3 3  Запрос задействует механизм [[CTE>>doc:Разработка.Базы данных.SQL.MSSQL.TSQL.CTE.WebHome]].
4 4  
3 +{{code language="sql"}}
4 +WITH RECURSIVE tree (nm, id, level, pathstr)
5 +AS
6 +(
7 + --Первый элемент в выборке. Начало рекурсии
8 + SELECT
9 + nm,
10 + id,
11 + 0,
12 + cast('' as text)
13 + FROM tree_sample
14 + WHERE id_parent is null
5 5  
6 -Рекурсивные запросы в PostgreSQL (WITH RECURSIVE)
7 -https://habr.com/ru/post/269497/
16 + UNION ALL
17 +
18 + --Каждый последующий элемент рекурсии
19 + SELECT
20 + tree_sample.nm,
21 + tree_sample.id,
22 + t.level + 1,
23 + tree.pathstr + tree_sample.nm
24 + FROM tree_sample
25 + INNER JOIN tree
26 + on tree.id = tree_sample.id_parent
27 +)
28 +
29 +SELECT
30 + id,
31 + space(level) + nm as nm
32 +FROM tree
33 +ORDER BY pathstr
34 +{{/code}}
35 +
36 +Рекурсивные SQL запросы
37 +https://habr.com/ru/post/27439/
38 +
39 +----
40 +
41 +**Дополнение:**
42 +
43 +В некоторых случаях рекурсивного запроса можно избежать (в случае извлечения из хранилища некоторого агрегата).
44 +Достаточно помимо ключа/отношения Parent-Child, добавить ключ/отношение Root-Child.
45 +Таким образом можно извлечь все поддерево Root элемента за 1 join.
46 +Это немного усложнит модель - в случае выполнения update нужно не забыть обновить оба поля. (Чтобы не допустить состояния, когда родительский элемент принадлежит к другому Root элементу)
47 +
48 +----
49 +
50 +