Исходный код вики Рекурсивный запрос
Редактировал(а) Alexandr Fokin 2023/12/16 14:12
Последние авторы
author | version | line-number | content |
---|---|---|---|
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 |