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

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

Последние авторы
1 Запрос задействует механизм [[CTE>>doc:Разработка.Базы данных.SQL.MSSQL.TSQL.CTE.WebHome]].
2
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
15
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