Деревянные запросы в MIS3 — различия между версиями

Материал из ИбисоПедии
Перейти к: навигация, поиск
(Использование tablefunc)
м
 
(не показано 8 промежуточных версий 2 участников)
Строка 3: Строка 3:
 
В postgresql есть известно три способа работы с деревьями:
 
В postgresql есть известно три способа работы с деревьями:
  
1. id, parent_id и использование конструкции WITH RECURSIVE
+
# id, parent_id и использование конструкции WITH RECURSIVE
2. Использование расширения ltree
+
# Использование расширения ltree
3. Использование расширения tablefunc
+
# Использование расширения tablefunc
  
 
== Использование конструкции WITH RECURSIVE ==
 
== Использование конструкции WITH RECURSIVE ==
  
  
<source lang="sql">
+
<source lang=txt>
-- Выбор дерева подраздеделинй
+
-- Выбор корневой ветки из дерева подраздеделинй
 
WITH RECURSIVE dept_tree(id, name, parent_id, depth, path,
 
WITH RECURSIVE dept_tree(id, name, parent_id, depth, path,
 
       ppath, root_id) AS (
 
       ppath, root_id) AS (
Строка 41: Строка 41:
  
  
<source lang="sql">
+
<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)
 
=== Недостатки ===
 
=== Недостатки ===
 +
 
* есть мнение, что на больших запросах потребляет много ресурсов
 
* есть мнение, что на больших запросах потребляет много ресурсов
 
  
 
== Использование ltree ==
 
== Использование ltree ==
Строка 65: Строка 67:
 
Документация postgresql: http://www.postgresql.org/docs/current/static/ltree.html
 
Документация postgresql: http://www.postgresql.org/docs/current/static/ltree.html
  
<source lang="sql">
+
Примеры:
 +
 
 +
<source>
 
-- Весь КЛДАР для региона
 
-- Весь КЛДАР для региона
 
SELECT *
 
SELECT *
Строка 78: Строка 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.naz_dict)
  
 
=== Недостатки ===
 
=== Недостатки ===
* сложен в первоначальной програмировании (дополнительнее поле + тригера)
+
* сложен в первоначальной программировании (дополнительное поле + тригера)
  
 
== Использование tablefunc ==
 
== Использование tablefunc ==

Текущая версия на 11:26, 8 сентября 2023

Общие сведения

В postgresql есть известно три способа работы с деревьями:

  1. id, parent_id и использование конструкции WITH RECURSIVE
  2. Использование расширения ltree
  3. Использование расширения 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