分享

postgresql 递归查询上下级节点树

 wwq图书世界 2022-06-17 发布于山东

1、表结构如下

CREATE TABLE "public"."city" (
  "id" int4 NOT NULL DEFAULT nextval('city_id_seq'::regclass),
  "name" varchar(255) COLLATE "pg_catalog"."default",
  "parent_id" int4
)
;

ALTER TABLE "public"."city" OWNER TO "postgres";

COMMENT ON COLUMN "public"."city"."id" IS '主键';

COMMENT ON COLUMN "public"."city"."name" IS '地区';

COMMENT ON COLUMN "public"."city"."parent_id" IS '主键';

2、插入数据

INSERT INTO "public"."city" VALUES (1, '中国', NULL);
INSERT INTO "public"."city" VALUES (2, '重庆', 1);
INSERT INTO "public"."city" VALUES (3, '四川', 1);
INSERT INTO "public"."city" VALUES (4, '北京', 1);
INSERT INTO "public"."city" VALUES (5, '渝北区', 2);
INSERT INTO "public"."city" VALUES (6, '九龙坡区', 2);
INSERT INTO "public"."city" VALUES (7, '大渡口区', 2);
INSERT INTO "public"."city" VALUES (8, '广安', 3);
INSERT INTO "public"."city" VALUES (9, '成都', 3);
INSERT INTO "public"."city" VALUES (10, '德阳', 3);
INSERT INTO "public"."city" VALUES (11, '邻水县', 8);
INSERT INTO "public"."city" VALUES (12, '九龙镇', 11);
INSERT INTO "public"."city" VALUES (13, '御临镇', 11);
INSERT INTO "public"."city" VALUES (14, '昌平区', 4);
INSERT INTO "public"."city" VALUES (15, '怀柔区', 4);

3、想下递归查询

WITH RECURSIVE r AS (
       SELECT * FROM city WHERE id = 3
     union   ALL
       SELECT city.* FROM city, r WHERE city.parent_id = r.id
     )
SELECT * FROM r ORDER BY id;

结果如下:
在这里插入图片描述
4、向上递归查询

WITH RECURSIVE r AS (
       SELECT * FROM city WHERE id = 8
     union   ALL
       SELECT city.* FROM city, r WHERE city.id = r.parent_id
     )
SELECT * FROM r ORDER BY id;

结果如下:
在这里插入图片描述

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约