Следующий запрос выводит содержимое справочника товарных групп, причем в колонке
path для каждой группы формируется путь к корневому элементу дерева через конкатенцию идентификаторов всех родительских узлов:
WITH RECURSIVE
group_tree AS (
SELECT
CAST('' AS VARCHAR(120)) as path,
-1 as id,
-1 as parent,
CAST('' AS dname) as name
FROM
rdb$database
UNION ALL
SELECT
IIF(gt.path > '', gt.path || '.', '') || g2.id,
g2.id,
g2.parent,
g2.name
FROM
gd_goodgroup g2 JOIN group_tree gt
ON COALESCE(g2.parent, -1) = gt.id
)
SELECT
*
FROM
group_tree
WHERE
path > ''
Запрос может быть легко изменен для любого древовидного справочника из базы данных Гедымина.
Если из получаемого пути следует исключить наименование корневой группы, то строку:
IIF(gt.path > '', gt.path || '.', '') || g2.id,
Следует заменить на:
IIF(gt.path > '', gt.path || '.', '') ||
IIF(g2.parent IS NULL, '', g2.id),
Для того, чтобы запрос возвращал только пути элементов для поддерева заданного его корневым узлом, следует заменить первый SELECT в объединении на:
SELECT
CAST(name AS VARCHAR(120)) as path,
id,
parent,
name
FROM
gd_goodgroup
WHERE
id = идентификатор_корня_поддерева
2 комментария:
Можно ещё и так:
select (select cast(list(gr1.name,' -> ') as varchar(1024)) from gd_goodgroup gr1 where gr1.lb <= gr.lb and gr1.rb >= gr.rb) grp,
(select cast(list(gr1.id,'.') as varchar(1024)) from gd_goodgroup gr1 where gr1.lb <= gr.lb and gr1.rb >= gr.rb) grpid,
gr.name
from gd_goodgroup gr
Order by grp
Вернее так:
select (select cast(list(name,' -> ') as varchar(1024)) from (
select gr1.name from gd_goodgroup gr1 where gr1.lb <= gr.lb and gr1.rb >= gr.rb order by gr1.lb)) grp,
(select cast(list(id,'.') as varchar(1024)) from (
select gr1.id from gd_goodgroup gr1 where gr1.lb <= gr.lb and gr1.rb >= gr.rb order by gr1.lb)) grpid, gr.name
from gd_goodgroup gr
Order by grp
Отправить комментарий