Деревянные запросы в MIS3 — различия между версиями
Материал из ИбисоПедии
(→Использование ltree) |
Admin (обсуждение | вклад) м |
||
| (не показано 6 промежуточных версий 2 участников) | |||
| Строка 3: | Строка 3: | ||
В postgresql есть известно три способа работы с деревьями: | В postgresql есть известно три способа работы с деревьями: | ||
| − | + | # id, parent_id и использование конструкции WITH RECURSIVE | |
| − | + | # Использование расширения ltree | |
| − | + | # Использование расширения tablefunc | |
== Использование конструкции WITH RECURSIVE == | == Использование конструкции WITH RECURSIVE == | ||
| − | <source lang= | + | <source lang=txt> |
-- Выбор корневой ветки из дерева подраздеделинй | -- Выбор корневой ветки из дерева подраздеделинй | ||
WITH RECURSIVE dept_tree(id, name, parent_id, depth, path, | WITH RECURSIVE dept_tree(id, name, parent_id, depth, path, | ||
| Строка 41: | Строка 41: | ||
| − | <source | + | <source> |
-- Справочник травм | -- Справочник травм | ||
WITH RECURSIVE task_tree (id, name, parent_id, depth, path, ppath) AS ( | WITH RECURSIVE task_tree (id, name, parent_id, depth, path, ppath) AS ( | ||
| Строка 55: | Строка 55: | ||
Где используется в MIS3: | Где используется в MIS3: | ||
| − | * небольшие древовидные справочники: подразделения | + | * небольшие древовидные справочники: |
| − | * | + | ** подразделения (mm.dept_dir) |
| + | ** травмы (mm.travm) | ||
| + | ** специализации (mm.spec) | ||
=== Недостатки === | === Недостатки === | ||
| + | |||
* есть мнение, что на больших запросах потребляет много ресурсов | * есть мнение, что на больших запросах потребляет много ресурсов | ||
| Строка 64: | Строка 67: | ||
Документация postgresql: http://www.postgresql.org/docs/current/static/ltree.html | Документация postgresql: http://www.postgresql.org/docs/current/static/ltree.html | ||
| − | <source | + | Примеры: |
| + | |||
| + | <source> | ||
-- Весь КЛДАР для региона | -- Весь КЛДАР для региона | ||
SELECT * | SELECT * | ||
| Строка 77: | Строка 82: | ||
</source> | </source> | ||
| + | <source> | ||
| + | -- выбор типов назначений из определенной ветки | ||
| + | select id | ||
| + | from mm.naz_dict nd | ||
| + | where nd.path <@ | ||
| + | ( | ||
| + | select path | ||
| + | from mm.naz_dict nnd | ||
| + | where nnd.synonim = 'GROUP_INS' | ||
| + | ) | ||
| + | |||
| + | </source> | ||
Где используется в MIS3 | Где используется в MIS3 | ||
* КЛАДР (mm.kladr) | * КЛАДР (mm.kladr) | ||
| Строка 82: | Строка 99: | ||
=== Недостатки === | === Недостатки === | ||
| − | * сложен в первоначальной | + | * сложен в первоначальной программировании (дополнительное поле + тригера) |
== Использование tablefunc == | == Использование tablefunc == | ||
Текущая версия на 11:26, 8 сентября 2023
Содержание
Общие сведения
В postgresql есть известно три способа работы с деревьями:
- id, parent_id и использование конструкции WITH RECURSIVE
- Использование расширения ltree
- Использование расширения tablefunc
Использование конструкции WITH RECURSIVE
-- Выбор корневой ветки из дерева подраздеделинй
WITH RECURSIVE dept_tree(id, name, parent_id, depth, path,
ppath, root_id) AS (
SELECT id,
name,
parent_id,
1,
ARRAY [t.id],
t.name::text,
id as root_id
FROM mm.dept_dir t
WHERE t.parent_id is null
UNION ALL
SELECT s.id,
s.name,
s.parent_id,
tt.depth + 1,
path || s.id,
ppath || ' \ ' || s.name,
tt.root_id
FROM mm.dept_dir s,
dept_tree tt
WHERE s.parent_id = tt.id)
select ddd.root_id from dept_tree ddd where ddd.id=6
-- Справочник травм
WITH RECURSIVE task_tree (id, name, parent_id, depth, path, ppath) AS (
SELECT id, name, parent_id, 1, ARRAY[t.id], t.name :: text
FROM mm.travm t WHERE t.parent_id is null
UNION ALL
SELECT s.id, s.name, s.parent_id, tt.depth + 1, path || s.id, ppath || ' \ ' || s.name
FROM mm.travm s, task_tree tt WHERE s.parent_id = tt.id
)
SELECT id, name, parent_id, ppath FROM task_tree
ORDER BY 2 ASC;Где используется в MIS3:
- небольшие древовидные справочники:
- подразделения (mm.dept_dir)
- травмы (mm.travm)
- специализации (mm.spec)
Недостатки
- есть мнение, что на больших запросах потребляет много ресурсов
Использование ltree
Документация postgresql: http://www.postgresql.org/docs/current/static/ltree.html
Примеры:
-- Весь КЛДАР для региона
SELECT *
FROM mm.kladr AS m
WHERE m.path <@
(
SELECT path
from mm.kladr k
where k.name = 'Адыгея' and
parent_id = 0
)-- выбор типов назначений из определенной ветки
select id
from mm.naz_dict nd
where nd.path <@
(
select path
from mm.naz_dict nnd
where nnd.synonim = 'GROUP_INS'
)Где используется в MIS3
- КЛАДР (mm.kladr)
- Словарь назначений (mm.naz_dict)
Недостатки
- сложен в первоначальной программировании (дополнительное поле + тригера)
Использование tablefunc
см документацию postgresql для "connectby" http://www.postgresql.org/docs/9.4/static/tablefunc.html