Greenplum(PostgreSql)使用 with recursive 实现树形结构递归查询并插入新表
本代码目的是替代Oracle的connect by语句,并实现后者的path和idleaf功能。
正文开始:
假设表org,字段有 id(编号),name(名称),pid(上级编号), 最上级的记录pid为空。
如:
id name pid
1 集团 null
2 财务部 1
3 行政部 1
4 主办会计 2
实现目标表neworg:
id name pid pname path_id path_name leve is_leaf(叶子节点)
1 集团 null null /1 /集团 1 0
2 财务部 1 集团 /1/2 /集团/财务部 2 0
3 行政部 1 集团 /1/3 /集团/行政部 2 1
4 主办会计 2 财务部 /1/2 /集团/财务部/主办会计 2 1
代码手写,如有拼写错误请见谅:
set gp_recursive_cte_prototype to ture; -- 部分低版本greenplum必须加
insert into neworg
(
id, name, pid, path_id, path_name, leve, is_leaf
)
with recursive result_ as -- 递归主体开始
(
select id -- 首先是顶层节点
, name
, pid
, cast(id as varchar(100)) as path_id -- 保证格式与目标表相同
, cast(name as varchar(500)) as path_name
, 1 as leve
from org
where id = '' -- 指定顶层节点位置
union all -- 下面是下层节点
select org.id
, org.name
, org.pid
, cast(r.id || '/' || org.id as varchar(100)) as path_id -- 拼接时加上斜杠
, cast(r.name || '/' || org.name as varchar(500)) as path_name -- 拼接时加上斜杠
, r.leve + 1 as leve -- 每递归一次 + 1
, 0 as is_leaf
from result_ r -- 注意这里是 result_
join org on org.pid = r.id -- 指定父子关系,这里注意其实是inner join
where 1 = 1 -- 有其他条件可加在这里
)
-- 然后这里可以查询result_了,同时加工is_leaf字段
select t.id, t.name, t.pid, org.name as pname
, '/' || t.path_id as path_id -- 格式化避免顶层缺少斜杠
, '/' || t.path_name as path_name
, t.leve
, case when trim(t.id) in (select distinct a1.pid from org a1 ) then '' else '' and as id_leaf -- 判断是否叶子节点,写在此处当表数据量较大时效率较低,可以考虑额外跟新。
from result_ t
left join org on t.pid = org.id -- 再关联一下父级信息
Greenplum(PostgreSql)使用 with recursive 实现树形结构递归查询并插入新表的更多相关文章
- SQL 实现地区的实现树形结构递归查询(无限级分类),level为节点层级,由小至大依次
//SQL 实现地区的实现树形结构递归查询(无限级分类),level为节点层级,由小至大依次 2018-09-25 StringBuilder areaSQL = new StringBuilder( ...
- SqlServer :实现树形结构递归查询(无限极分类)
SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它.每个CTE仅被定义一 ...
- sqlserver实现树形结构递归查询(无限极分类)
SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 百度百科 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它.每个CTE ...
- mysql树形结构递归查询
之前一直用的是Oracle,对于树形查询可以使用start with ... connect by ' connect by id = prior parent_id; 没错,这是Oracle所支持的 ...
- 部门树形结构,使用Treeview控件显示部门
部门树形结构.设计张部门表用于存储部门编码.名称.上级部门id,使用Treeview控件显示部门树,并实现部门增删改.移动.折叠等功能.特别提示,部门有层级关系,可用donetbar的adtree控件 ...
- MySql/Oracle树形结构查询
Oracle树形结构递归查询 在Oracle中,对于树形查询可以使用start with ... connect by select * from treeTable start with id='1 ...
- mysql ---复制表结构---创建新表
1.复制表结构及数据到新表CREATE TABLE 新表SELECT * FROM 旧表这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete from newtable;来删 ...
- mysql复制表数据或表结构到新表中
MySQL复制表数据到新表的几个步骤. 1.MySQL复制表结构及数据到新表 CREATE TABLE new_table SELECT * FROM old_table; 2.只复制表结构到新表 C ...
- [从产品角度学EXCEL 02]-EXCEL里的树形结构
这是<从产品角度学EXCEL>系列第三篇. 前言请看: 0 为什么要关注EXCEL的本质 1 excel是怎样运作的 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布 ...
随机推荐
- 安卓Unity3d游戏的逆向破解
使用到的工具 ApkToolBox .NET Reflector Reflexil(.NET程序编辑器) 怎么判定它是Unity游戏呢 一般的路径格式是这样的assets\bin\Data\Manag ...
- apue第4章习题
4.1 用 stat 函数替换图 4-3 程序中的 lstat函数,如若命令行残数之一是符号链接,会发生什么变化? stat不支持链接,如果有参数是链接符号,会显示链接后的文件属性. 4.2 如果文件 ...
- Anaconda配置
0x00 下载 为了更快的下载,可以到清华开源软件镜像站下载 地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 在此以Anaconda ...
- Eclipse中properties文件,中文只显示Unicode问题(Properties Editor)
我们常常在properties文件中添加中文注释,而properties文件的中文需用unicode表示, 使用eclipse默认的properties文件编辑器查看显示中文为乱码. 即便修改prop ...
- STM32嵌入式开发学习笔记(六):串口通信(上)
本文我们将了解STM32与外部设备通过串口通信的方式. 所谓串口通信,其实是一个类似于计算机网络的概念,它有物理层,比如规定用什么线通信,几伏特算高电平,几伏特算低电平.传输层,通信前要发RTS,CT ...
- 30天轻松学习javaweb_通过javac编译java文件
通过javac编译java文件1.先导入需要引用的包D:\Program Files (x86)\apache-tomcat-7.0.53\webapps\test\WEB-INF\classes&g ...
- python 如何自动发送测试报告
首先,下载HTMLTestRuner.py文件. 源地址:http://tungwaiyip.info/software/HTMLTestRunner.html ,其次:把下载好的HTMLTestRu ...
- 【Javescript】DOM(文档对象模型)
1.定义: DOM是Document Object Model文档对象模型的缩写.是针对HTML和XML文档的一个API,通过DOM可以去改变文档. 例如:我们有一段HTML,那么如何访问第二层第一个 ...
- Invoking destroy method 'close' on bean with name 'dataSource'
Invoking destroy method 'close' on bean with name 'dataSource' Spring与Mybatis整合时出现的问题,找了一晚上结果是一个属性写错 ...
- PHP面试 PHP基础知识 九(面向对象)
面向对象 PHP的类权限控制修饰符 public(公共的) . protected(受保护的).private(私有的) public :最高权限 可以在类的内部使用 可以在类的外部使用 可以 ...