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

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

От версии 2.2
отредактировано Alexandr Fokin
на 2020/07/18 14:03
Изменить комментарий: Добавлен тег [SqlQuery]
К версии 4.1
отредактировано Alexandr Fokin
на 2022/03/19 13:10
Изменить комментарий: К данной версии нет комментариев

Сводка

Подробности

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