本代码目的是替代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 实现树形结构递归查询并插入新表的更多相关文章

  1. SQL 实现地区的实现树形结构递归查询(无限级分类),level为节点层级,由小至大依次

    //SQL 实现地区的实现树形结构递归查询(无限级分类),level为节点层级,由小至大依次 2018-09-25 StringBuilder areaSQL = new StringBuilder( ...

  2. SqlServer :实现树形结构递归查询(无限极分类)

    SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它.每个CTE仅被定义一 ...

  3. sqlserver实现树形结构递归查询(无限极分类)

    SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式 百度百科 公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它.每个CTE ...

  4. mysql树形结构递归查询

    之前一直用的是Oracle,对于树形查询可以使用start with ... connect by ' connect by id = prior parent_id; 没错,这是Oracle所支持的 ...

  5. 部门树形结构,使用Treeview控件显示部门

    部门树形结构.设计张部门表用于存储部门编码.名称.上级部门id,使用Treeview控件显示部门树,并实现部门增删改.移动.折叠等功能.特别提示,部门有层级关系,可用donetbar的adtree控件 ...

  6. MySql/Oracle树形结构查询

    Oracle树形结构递归查询 在Oracle中,对于树形查询可以使用start with ... connect by select * from treeTable start with id='1 ...

  7. mysql ---复制表结构---创建新表

    1.复制表结构及数据到新表CREATE TABLE 新表SELECT * FROM 旧表这种方法会将oldtable中所有的内容都拷贝过来,当然我们可以用delete from newtable;来删 ...

  8. mysql复制表数据或表结构到新表中

    MySQL复制表数据到新表的几个步骤. 1.MySQL复制表结构及数据到新表 CREATE TABLE new_table SELECT * FROM old_table; 2.只复制表结构到新表 C ...

  9. [从产品角度学EXCEL 02]-EXCEL里的树形结构

    这是<从产品角度学EXCEL>系列第三篇. 前言请看: 0 为什么要关注EXCEL的本质 1 excel是怎样运作的 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布 ...

随机推荐

  1. pandas for python

    http://pandas.pydata.org/pandas-docs/stable/user_guide/index.html 不算太难,需要拿一本线性代数看看矩阵原理即可.重点在于考虑如何运用, ...

  2. Java-Class-@I:io.swagger.annotation.Api

    ylbtech-Java-Class-@I:io.swagger.annotation.Api 1.返回顶部   2.返回顶部 1. package com.ylbtech.api.controlle ...

  3. Gerrit Handbook for Commercial Project

    前注:常见‘坑’ 不要使用 2.14 版本 gerrit.conf 中 [sendemail] 部分必须有 from = ... 字段,否则无法添加邮箱 gerrit 以用户组为单位划分权限,先将用户 ...

  4. 剑指offer——38二叉搜索树与双向链表

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.   题解: 在搜索二义树中,左子节点的值总是小于父节点的值,右子节点的值总 ...

  5. 百度编译器ueditor目录创建失败问题解决

    修改ueditor编辑器的文件Uploader.class.php   例如: vim protected/widget/ueditor/php/Uploader.class.php :283 if( ...

  6. 分享一套主流框架源码资料,征服阿里 P7 面试必备!

    2019年已经过完一半了, 我在这里为大家准备了一份资料,征服阿里 P7 面试必备! 希望这些资料可以帮助到大家,从一个码农进阶为一个优秀的程序员,也可以帮大家提升系统实战能力. 这些资料包括: 讲解 ...

  7. 高级UI晋升之常用View(三)下篇

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从WebView来介绍常用View: 一.WebView介绍 Andro ...

  8. jsk

    题目描述 码队的女朋友非常喜欢玩某款手游,她想让码队带他上分.但是码队可能不会带青铜段位的女朋友上分,因为码队的段位太高(已经到达王者),恐怕不能和他的女朋友匹配游戏. 码队的女朋友有些失落,她希望能 ...

  9. fabs() abs()

    fabs() 面向实数取绝对值 abs() 返回int

  10. Dubbo多注册中心和Zookeeper服务的迁移

    一.Dubbo多注册中心 1. 应用场景 例如阿里有些服务来不及在青岛部署,只在杭州部署,而青岛的其它应用需要引用此服务,就可以将服务同时注册到两个注册中心. consumer.xml <?xm ...