首页 > IT职业 > > PostgreSQL树形结构的递归查询示例
背景
处理不确定深度的层级结构,比如组织机构,一个常用的设计是在一张表里面保存 ID 和 Parent_ID ,并且通过自联结的办法构造一颗树。这种方式对写数据的过程很友好,但是查询过程就变得相对复杂。在不引入MPTT模型的前提下,必须通过递归算法来查询某个节点和下级子节点。
Oracle提供的connect by扩展语法,简单好用。但是其他的RDBMS就没这么人性化了(或者我不知道)。最近在项目中使用PostgreSQL来查询树形数据,记录一下。
构造样本数据
connectby函数
如果安装了 tablefunc 扩展,就可以使用PG版本的connectby函数。这个没有Oracle那么强大,但是可以满足基本要求。
PS:虽然通过join可以查询出节点的code,但是branch部分不能直接转换成对应的code,使用上还是不太方便。
CTE语法
使用CTE语法,通过 with recursive 来实现树形数据的递归查询。这个方法虽然没有connectby那么直接,但是灵活性和显示效果更好。
执行过程说明
从上面的例子可以看出,WITH RECURSIVE语句包含了两个部分
执行步骤如下
以上面的query为例,来看看具体过程
执行non-recursive query
执行recursive query
3、继续执行recursive query,直到结果集和working table为空
4、结束递归,将前三个步骤的结果集合并,即得到最终的WITH RECURSIVE的结果集。
严格来讲,这个过程实现上是一个迭代的过程而非递归,不过RECURSIVE这个关键词是SQL标准委员会定立的,所以PostgreSQL也延用了RECURSIVE这一关键词。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3125024/ ,如需转载,请注明出处,否则将追究法律责任。