PostgreSQL递归查询

Posted 清风凌雪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL递归查询相关的知识,希望对你有一定的参考价值。

1. 语法结构

with recursive 名字 as (
A.初始条件语句(非递归部分)

union [all]

B.递归部分语句
) [SELECT | INSERT | UPDATE | DELETE]

1.1 说明

  1. 前半部分A为初始条件语句,后半部分B为要进行的递归语句
  2. 先执行A语句,然后将A语句的结果作为B语句的条件,如果需要对查询结果去重则使用union进行连接,否则使用union all进行连接

2 示例

2.1 表结构

DROP TABLE IF EXISTS "test"."rbac_menu";
CREATE TABLE "test"."rbac_menu" (
"id" int8 NOT NULL,
"pid" int8,
"menu_name" varchar(255) COLLATE "pg_catalog"."default"
)
;
COMMENT ON COLUMN "test"."rbac_menu"."id" IS ID;
COMMENT ON COLUMN "test"."rbac_menu"."pid" IS 父ID;
COMMENT ON COLUMN "test"."rbac_menu"."menu_name" IS 菜单名称;

-- ----------------------------
-- Records of rbac_menu
-- ----------------------------
INSERT INTO "test"."rbac_menu" VALUES (100101, 1001, 权限管理);
INSERT INTO "test"."rbac_menu" VALUES (10010101, 100101, 菜单管理);
INSERT INTO "test"."rbac_menu" VALUES (10010102, 100101, 用户管理);
INSERT INTO "test"."rbac_menu" VALUES (10010103, 100101, 角色管理);
INSERT INTO "test"."rbac_menu" VALUES (1001010101, 10010101, 设置角色);
INSERT INTO "test"."rbac_menu" VALUES (1001010102, 10010101, 设置用户);
INSERT INTO "test"."rbac_menu" VALUES (1001010301, 10010103, 查看);
INSERT INTO "test"."rbac_menu" VALUES (1001010302, 10010103, 新增);
INSERT INTO "test"."rbac_menu" VALUES (1001010303, 10010103, 修改);
INSERT INTO "test"."rbac_menu" VALUES (1001010304, 10010103, 删除);

-- ----------------------------
-- Primary Key structure for table rbac_menu
-- ----------------------------
ALTER TABLE "test"."rbac_menu" ADD CONSTRAINT "rbac_menu_pkey" PRIMARY KEY ("id");

PostgreSQL递归查询_postgresql

2.1 根据父节点获取所有子节点信息

with recursive temp_table as (
select "id", pid, "menu_name" from rbac_menu where pid = 1001
union
select a."id", a.pid, a."menu_name" from rbac_menu a,temp_table b where a.pid = b."id"
) select * from temp_table
order by pid, "id";

PostgreSQL递归查询_postgresql_02

2.2 根据子节点获取所有父节点信息

with recursive temp_table as (
select "id", pid, "menu_name" from rbac_menu where "id" = 10060101
union
select a."id", a.pid, a."menu_name" from rbac_menu a,temp_table b where a.id = b.pid
) select * from temp_table
order by pid desc, "id" desc

PostgreSQL递归查询_postgresql_03

以上是关于PostgreSQL递归查询的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL递归查询

PostgreSQL递归查询计算父值

PostgreSQL递归查询以获得排名边缘

PostgreSQL 在递归查询中找到所有可能的组合(排列)

postgresql with递归

oracle和postgresql 递归查询父子关系记录语法区别