将邻接列表转换为PostgreSQL中的ltree

时间:2018-04-03 13:56:21

标签: sql postgresql tree

我在PostgreSQL 9.6中存储了一个树形结构作为邻接列表:

"部门" table(parent_id = -1表示节点没有父节点)

   id   |   name   |   parent_id
-----------------------------------
-1      | NULL     | -1
 1      | Dep_1    | -1
 2      | Dep_2    |  1
 3      | Dep_3    |  1
 4      | Dep_4    |  3
 5      | Dep_5    | -1

我需要将其转换为ltree类型,并将id' s作为路径标签:

   id   |   name   |   path
------------------------------
1       | Dep_1    | 1
2       | Dep_2    | 1.2
3       | Dep_3    | 1.3
4       | Dep_4    | 1.3.4
5       | Dep_5    | 5

最简单的方法是什么?是否可以只使用SQL?

1 个答案:

答案 0 :(得分:1)

让我们说我创建一个表格a并用你的数据填充它,然后递归CTE会做得很整洁:

t=# with recursive r(id, name, path) as (
    select id, name, ''::text
    from a
    where id = -1
union all
    select o.id, o.name, concat(path, '.', o.id)
    from a o
    join r n on o.parent_id = n.id and o.id <> -1
)
select id,name,right(path,-1)::ltree path
from r
where id <> -1
order by id asc;
 id |    name    | path
----+------------+-------
  1 |  Dep_1     | 1
  2 |  Dep_2     | 1.2
  3 |  Dep_3     | 1.3
  4 |  Dep_4     | 1.3.4
  5 |  Dep_5     | 5
(5 rows)