Деревянные запросы в MIS3 — различия между версиями
Материал из ИбисоПедии
Admin (обсуждение | вклад) (→Использование конструкции WITH RECURSIVE) |
Admin (обсуждение | вклад) м |
||
| Строка 60: | Строка 60: | ||
** специализации (mm.spec) | ** специализации (mm.spec) | ||
=== Недостатки === | === Недостатки === | ||
| + | |||
* есть мнение, что на больших запросах потребляет много ресурсов | * есть мнение, что на больших запросах потребляет много ресурсов | ||
| Строка 82: | Строка 83: | ||
<source> | <source> | ||
| − | -- выбор типов назначений из | + | -- выбор типов назначений из определенной ветки |
select id | select id | ||
from mm.naz_dict nd | from mm.naz_dict nd | ||
| Строка 98: | Строка 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