Изменения документа Рекурсивный запрос
Редактировал(а) Alexandr Fokin 2023/12/16 14:12
От версии 4.2
отредактировано Alexandr Fokin
на 2023/12/16 14:01
на 2023/12/16 14:01
Изменить комментарий:
Updated parent field.
К версии 2.4
отредактировано Alexandr Fokin
на 2021/05/08 11:56
на 2021/05/08 11:56
Изменить комментарий:
Update document after refactoring.
Сводка
-
Свойства страницы (2 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Родительский документ
-
... ... @@ -1,1 +1,1 @@ 1 - xwiki:Разработка.Базы данных2.SQL.MSSQL.SQLзапросы.WebHome1 +Разработка.Базы данных.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 - UNIONALL12 + 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 - SELECT30 - id, 31 - space(level) + nmas nm32 - FROMtree33 - ORDER BY pathstr22 + 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 -