0
点赞
收藏
分享

微信扫一扫

PostgreSQL递归查询

星巢文化 2022-04-02 阅读 34

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

举报

相关推荐

0 条评论