美文网首页数据库
2024-06-20 PostgreSQL 之递归查询

2024-06-20 PostgreSQL 之递归查询

作者: 孤獨的劍客 | 来源:发表于2024-06-19 10:01 被阅读0次
PostgreSQL 之递归查询树状层次结构表
PostgreSQL 之递归查询树状层次结构表

PostgreSQL 的 WITH 查询有一个特殊的选项 RECURSIVE,他可以引用自身的输出,从而实现递归。递归查询通常用于处理层次或者树状结构的数据。

CREATE TABLE public.tree_data (
 id bigserial,
 tree_code VARCHAR(20),
 tree_name VARCHAR(20),
 tree_level INT8,
 tree_pcode VARCHAR(20),
 tree_sort INT8,
 tree_state INT8,
 create_time TIMESTAMP(0),
 create_userid INT8,
 create_user VARCHAR(20),
 update_time TIMESTAMP(0),
 update_userid INT8,
 update_user VARCHAR(20));
 
 COMMENT ON COLUMN tree_data.id IS '自增主键';
 COMMENT ON COLUMN tree_data.tree_code IS '编码';
 COMMENT ON COLUMN tree_data.tree_name IS '名称';
 COMMENT ON COLUMN tree_data.tree_level IS '层级ID';
 COMMENT ON COLUMN tree_data.tree_pcode IS '父编码';
 COMMENT ON COLUMN tree_data.tree_sort IS '排序';
 COMMENT ON COLUMN tree_data.tree_state IS '状态';
 COMMENT ON COLUMN tree_data.create_time IS '创建时间';
 COMMENT ON COLUMN tree_data.create_userid IS '创建人ID';
 COMMENT ON COLUMN tree_data.create_user IS '创建人';
 COMMENT ON COLUMN tree_data.update_time IS '更新时间';
 COMMENT ON COLUMN tree_data.update_userid IS '更新人ID';
 COMMENT ON COLUMN tree_data.update_user IS '更新人';
 
INSERT INTO public.tree_data(tree_code,tree_name,tree_level,tree_pcode,tree_sort,tree_state) VALUES('001', '中国', 0, NULL, 1, 1); 
INSERT INTO public.tree_data(tree_code,tree_name,tree_level,tree_pcode,tree_sort,tree_state) VALUES('002', '陕西', 1, '001', 1, 1); 
INSERT INTO public.tree_data(tree_code,tree_name,tree_level,tree_pcode,tree_sort,tree_state) VALUES('003', '四川', 1, '001', 2, 1);
INSERT INTO public.tree_data(tree_code,tree_name,tree_level,tree_pcode,tree_sort,tree_state) VALUES('004', '西安', 2, '002', 1, 1); 
INSERT INTO public.tree_data(tree_code,tree_name,tree_level,tree_pcode,tree_sort,tree_state) VALUES('005', '咸阳', 2, '002', 2, 1); 
INSERT INTO public.tree_data(tree_code,tree_name,tree_level,tree_pcode,tree_sort,tree_state) VALUES('006', '榆林', 2, '002', 3, 1); 
INSERT INTO public.tree_data(tree_code,tree_name,tree_level,tree_pcode,tree_sort,tree_state) VALUES('007', '成都', 2, '003', 1, 1); 
INSERT INTO public.tree_data(tree_code,tree_name,tree_level,tree_pcode,tree_sort,tree_state) VALUES('008', '绵阳', 2, '003', 2, 1); 
INSERT INTO public.tree_data(tree_code,tree_name,tree_level,tree_pcode,tree_sort,tree_state) VALUES('009', '雁塔区', 3, '004', 1, 1); 
INSERT INTO public.tree_data(tree_code,tree_name,tree_level,tree_pcode,tree_sort,tree_state) VALUES('010', '高新区', 3, '004', 2, 1); 
INSERT INTO public.tree_data(tree_code,tree_name,tree_level,tree_pcode,tree_sort,tree_state) VALUES('011', '灞桥区', 3, '004', 3, 1); 
INSERT INTO public.tree_data(tree_code,tree_name,tree_level,tree_pcode,tree_sort,tree_state) VALUES('012', '武侯区', 3, '007', 1, 1);

UPDATE public.tree_data SET create_time=NOW()::TIMESTAMP(0),create_userid=1001,create_user='创建人',update_time=NOW()::TIMESTAMP(0),update_userid=1002,update_user='修改人'; 

需求:给出一个 tree_code 找出他所在的省份
WITH RECURSIVE parent_tree_data(tree_code, tree_name, tree_pcode, tree_level, tree_state, create_time) AS (
SELECT tree_code, tree_name, tree_pcode, tree_level, tree_state, create_time
FROM public.tree_data 
WHERE tree_code = '012' 
UNION ALL 
SELECT td.tree_code, td.tree_name, td.tree_pcode, td.tree_level, td.tree_state, td.create_time
FROM public.tree_data AS td 
INNER JOIN parent_tree_data AS ptd ON td.tree_code = ptd.tree_pcode)

SELECT * FROM parent_tree_data WHERE tree_level = 1;
SELECT * FROM parent_tree_data WHERE tree_level = 2;

相关文章

  • postgresql递归查询总结

    背景 由于业务需要,app_labels表存储了所有专题以及content的树结构,而且这个树结构是不确定深度的,...

  • postgresql可以递归查询么

    PostgreSQL提供了WITH语句,允许你构造用于查询的辅助语句。这些语句通常称为公共表表达式或cte。cte...

  • postgresql递归查询转JSON

    1、创建数据表 2、插入记录 3、递归查询语句 运行结果如下: 数据量较大的情况下,递归查询较慢,所以要引入物化视...

  • Postgresql实现递归查询字典并转JSON

    现在有一张字典表,有二级 、三级字典项,需要递归查询并转换成JSON对象。字典数据情况如下: 查询语句如下: 查询...

  • SQL 日常用法积累

    自定义排序 多字段模糊查询 排序对空值的处理 postgresql jsonb数据查询 postgresql

  • postgresql 表的列名,数据库表名

    postgresql 查询某一个表中的所有字段,也就是查询所有的列名 postgresql 查询数据库表名

  • DNS解析原理:递归 VS 迭代

    DNS 解析分类 DNS解析流程分为递归查询和迭代查询,递归查询是以本地名称服务器为中心查询, 递归查询是默认方式...

  • Java工程师之Oracle技术-SQL入门(6)

    递归查询 递归查询 存在层级关系(树形)关系时,使用SQL语句可以把整个递归树全部查询出来 level 关键字可以...

  • postgresql 优化查询之 EXPLAIN

    最近项目上优化查询性能,了解下 explain,pg使用版本10.1 语法 EXPLAIN [ ( option ...

  • 数据库篇

    2018.07.04 postgresql查询表的大小 数据库中单个表的大小(不包括索引) postgresql的...

网友评论

    本文标题:2024-06-20 PostgreSQL 之递归查询

    本文链接:https://www.haomeiwen.com/subject/vlszxjtx.html