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

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

От версии 4.2
отредактировано Alexandr Fokin
на 2023/12/16 14:01
Изменить комментарий: Updated parent field.
К версии 2.4
отредактировано Alexandr Fokin
на 2021/05/08 11:56
Изменить комментарий: Update document after refactoring.

Сводка

Подробности

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