GBase 8s中的start with connect by用法

这篇具有很好参考价值的文章主要介绍了GBase 8s中的start with connect by用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如果表中存在层次数据,则可以使用层次化查询子句查询出表中行记录之间的层次关系
基本语法:

[ START WITH CONDITION1 ]
CONNECT BY [ NOCYCLE ] CONDITION2

示例:

select id,parentid,partname, level
from tabpart
start with id = 11
connect by nocycle prior id = parentid;

表中存在层次数据
数据之间的层次关系即父子关系,通过表中列与列间的关系来描述,如tabpart表中的id和parentid。id表示部门编号,parentid表示部门归属的更高层部门编号,在表的每一行中都有一个表示父节点的parentid(除根节点外),通过每个节点的父节点,就可以确定整个树结构。

CONNECT BY [ NOCYCLE ] CONDITION2 层次子句作用
CONDITION2 [PRIOR expr = expr] : 指定层次结构中父节点与子节点之之间的关系。
CONDITION2 中的 一元运算符 PRIORY 必须放置在连接关系的两列中某一个的前面。在连接关系中,除了可以使用列名外,还允许使用列表达式。

1.START WITH

start with 子句为可选项,用来标识哪行作为查找树型结构的第一行(即根节点,可指定多个根节点)。若该子句被省略,则表示所有满足查询条件的行作为根节点。

2.关于PRIOR PRIOR置于运算符前后的位置,决定着查询时的检索顺序。

2.1 从根节点自顶向下
-- sql 1
select id,parentid, level
from tabpart
start with parentid = 0
connect by prior id = parentid;

结果:

         id    parentid       level

          1           0           1
         13           1           2
         12           1           2
        123          12           3
        122          12           3
        121          12           3
       1213         121           4
       1212         121           4
       1211         121           4
         11           1           2
        113          11           3
        112          11           3
        111          11           3

分析
层次查询执行逻辑:
a.确定上一行(相对于步骤b中的当前行),若start with 子句存在,则以该语句确定的行为上一行,若不存在则将所有的数据行视为上一行。
b.从上一行出发,扫描除该行之外所有数据行。
c.匹配条件 prior id = parentid
注意 一元运算符 prior,意思是之前的,指上一行
当前行定义:步骤b中扫描得到的所有行中的某一行
匹配条件含义:当前行字段 parentid 的值等于上一行字段id中的值,若满足则取出该行,并将level + 1,匹配完所有行记录后,将满足条件的行作为上一行,执行步骤 b,c。直到所有行匹配结束。

2.2 从根节点自底向上
--sql 2
select id,parentid, level
from tabpart
start with id = 1211
connect by prior parentid = id;

结果:

         id    parentid       level

       1211         121           1
        121          12           2
         12           1           3
          1           0           4

分析
层次查询执行逻辑:
a.确定上一行(相对于步骤b中的当前行),若start with 子句存在,则以该语句确定的行为上一行,若不存在则将所有的数据行视为上一行。
b.从上一行出发,扫描除该行之外所有数据行。
c.匹配条件 parentid = id
注意 一元运算符 prior,意思是之前的,指上一行
当前行定义:步骤b中扫描得到的所有行中的某一行
匹配条件含义:当前行字段 id 的值等于上一行字段 parentid 中的值,若满足则取出该行,并将 level + 1,匹配完所有行记录后,将满足条件的行作为上一行,执行步骤 b,c。直到所有行匹配结束。

自顶向下,自下向上口诀:

start with child_id = 10 connect by [prior] child_id = [prior] parent_id 

prior 和子列在一起,表示寻找它的子孙,即自顶向下;

-- 向下
select id,parentid, level
from tabpart
start with id = 12
connect by prior id = parentid;

prior 和父列在一起,表示开始寻找它的爸爸,即自下向上;

-- 向上
select id,parentid, level
from tabpart
start with id = 12
connect by id =  prior parentid;

3.特定于层级查询的 SQL 语法

3.1 LEVEL伪列

指示该层级之内递归查询的哪一步骤返回了行。即从start with的条件开始为第一层,每一迭代加一层。示例如上。

3.2 CONNECT_BY_ISCYCLE 伪列

指示一行是否有一个还是其祖先的孩子。存在循环时,当出现该情况时,connect by子句应该加上NOCYCLE。
示例:
表中增加一行数据,使符合循环的要求,执行sql 1

-- sql 1
select id,parentid, level
from tabpart
start with parentid = 0
connect by prior id = parentid;

将报错:

26079: CONNECT BY 查询已导致循环。

加上NOCYCLE

select id,parentid, level, CONNECT_BY_ISCYCLE
from tabpart
start with parentid = 0
connect by nocycle prior id = parentid;

结果:

         id    parentid       level connect_by_iscycle

          1           0           1                  0
         13           1           2                  0
         12           1           2                  0
        123          12           3                  0
        122          12           3                  0
        121          12           3                  0
       1213         121           4                  0
       1212         121           4                  0
       1211         121           4                  0
          0        1211           5                  1
         11           1           2                  0
        113          11           3                  0
        112          11           3                  0
        111          11           3                  0
3.3 CONNECT_BY_ISLEAF 伪列

指示一行在查询返回的行之中是否有任何的孩子。如果是leaf(叶子),返回1,否则返回0。
示例:

select id,parentid, level, CONNECT_BY_ISLEAF
from tabpart
start with parentid = 0
connect by prior id = parentid;

结果:

         id    parentid       level connect_by_isleaf

          1           0           1                 0
         13           1           2                 1
         12           1           2                 0
        123          12           3                 1
        122          12           3                 1
        121          12           3                 0
       1213         121           4                 1
       1212         121           4                 1
       1211         121           4                 0
          0        1211           5                 0
         11           1           2                 0
        113          11           3                 1
        112          11           3                 1
        111          11           3                 1
3.4 SYS_CONNECT_BY_PATH 函数

可构建和返回一字符串,该字符串表示从指定的行到层级的根的路径。类似于wm_concat函数,按层次顺序拼接字段。
示例:

select id,parentid, level, SYS_CONNECT_BY_PATH(partname,'/')
from tabpart
start with parentid = 0
connect by nocycle prior id = parentid;

结果:

         id    parentid       level expression_1

          1           0           1 /总部
         13           1           2 /总部/华东区
         12           1           2 /总部/华南区
        123          12           3 /总部/华南区/海南
        122          12           3 /总部/华南区/广西
        121          12           3 /总部/华南区/广东
       1213         121           4 /总部/华南区/广东/佛山
       1212         121           4 /总部/华南区/广东/深圳
       1211         121           4 /总部/华南区/广东/广州
          0        1211           5 /总部/华南区/广东/广州/天河
         11           1           2 /总部/华北区
        113          11           3 /总部/华北区/天津
        112          11           3 /总部/华北区/河北
        111          11           3 /总部/华北区/北京
3.5 ORDER SIBLINGS BY中的SIBLINGS关键字

对返回的每个级别的同一父母的兄弟行进行排序。
示例:

select id,parentid, level, partname
from tabpart
start with id = 1
connect by nocycle prior id = parentid
ORDER SIBLINGS BY id;
3.6 CONNECT_BY_ROOT 运算符

为其运算对象的根祖先返回一表达式。
示例:

select id,parentid, level, CONNECT_BY_ROOT partname
from tabpart
start with parentid = 0
connect by nocycle prior id = parentid;

结果:

         id    parentid       level partname

          1           0           1 总部
         13           1           2 总部
         12           1           2 总部
        123          12           3 总部
        122          12           3 总部
        121          12           3 总部
       1213         121           4 总部
       1212         121           4 总部
       1211         121           4 总部
          0        1211           5 总部
         11           1           2 总部
        113          11           3 总部
        112          11           3 总部
        111          11           3 总部
3.7 PRIOR 运算符

引用从前一递归步骤返回的值(此处的“步骤”是指该递归查询的一次迭代)。
参见第二部分。

4. 示例用法

4.1 递归查询整个路径并行转列组合成字符串(自下而上)

递归查询路径

select id,parentid,partname, level
from tabpart
start with id = 1212
connect by nocycle id = prior parentid
order by level desc;

结果:

         id    parentid partnum                    level

          1           0 总部                           4
         12           1 华南区                         3
        121          12 广东                           2
       1211         121 广州                           1

自下而上,使用SYS_CONNECT_BY_PATH,获取的结果并不是需要的自上而下的顺序。这里可以使用wm_concat来拼接。

select replace(wm_concat(partname),',',' -> ')
from (
  select id,parentid, partname, level
  from tabpart
  start with id = 1211
  connect by nocycle id = prior parentid
  order by level desc
);

结果:

(expression)  总部 -> 华南区 -> 广东 -> 广州

涉及到的表结构及语句文章来源地址https://www.toymoban.com/news/detail-481203.html

drop table if exists tabpart;

create table tabpart(id int, parentid int, partname varchar(200),primary key(id));

insert into tabpart values(1,0,'总部');
insert into tabpart values(11,1,'华北区');
insert into tabpart values(12,1,'华南区');
insert into tabpart values(13,1,'华东区');
insert into tabpart values(111,11,'北京');
insert into tabpart values(112,11,'河北');
insert into tabpart values(113,11,'天津');
insert into tabpart values(121,12,'广东');
insert into tabpart values(122,12,'广西');
insert into tabpart values(123,12,'海南');
insert into tabpart values(1211,121,'广州');
insert into tabpart values(1212,121,'深圳');
insert into tabpart values(1213,121,'佛山');

-- 增加一行,用于循环
insert into tabpart values(0,1211,'天河区');
-- 修改为正确值
update tabpart set id = 12111 where id = 0;

到了这里,关于GBase 8s中的start with connect by用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GBASE南大通用分享,适用于 GBase 8s ESQL/C的Insert 游标

    关闭 Insert 游标  由于 GBase 8s 在 SPL 例程中不支持 Insert 游标,本节有关 Insert 游标的讨论仅适用于 GBase 8s ESQL/C。在 SPL 例程中,只能执行 DECLARE 语句定义的 Select 或 Function 游标的 CLOSE 语句。(SPL 的 FOREACH 语句在其语句块中包含 INSERT 语句可以声明功能类似 Insert 游标的 direc

    2024年01月20日
    浏览(31)
  • GBASE南大通用数据库GBase 8s常见问题讲堂 -- 字符集的设置

    本文摘自GBASE南大通用社区,by:wty,原文请点击:GBase 8s常见问题 -- 字符集相关问题|GBASE社区|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商 23103   Code-set conversion function failed due to an illegal sequence or invalid value. 字符集转换失败,字符串中

    2024年01月24日
    浏览(50)
  • 南大通用数据库(Gbase 8s) 创建UDR外部函数

    一、在使用 date_format、from_unixtime、to_days、yearweek 函数时,Gbase 8s 数据库不支持,可以使用创建 UDR 外部函数来实现 二、登录命令控制台或者使用 navicat 连接 Gbase 数据库 这里使用 navicat ,点击新增连接选择 PostGreSql 驱动,添加地址、账号、密码 连接数据库后,选中目标库选

    2024年02月12日
    浏览(33)
  • 01.GBase 8s GDCA 认证培训课前准备

    一、 GBase 8s 数据库软件获取 【百度云盘链接】:https://pan.baidu.com/s/1mGdmF5bm_kSPEHpMiCwEMA 【提取码】:ged8 【内容】: GBase8s_ExpressEdition.tar : GBase 8s Express版安装包(有效期1年) clientsdk_ExpressEdition.tar : GBase 8s CSDK-ODBC接口 二、搭建操作系统环境准备 (一)环境要求: 操作系统

    2024年02月05日
    浏览(28)
  • 三种Python操作GBase 8s数据库数据类型的差异

    Python可以通过多种方式操作GBase 8s数据库,常见的类型包括DbtPy(原生)、Pyodbc(ODBC方式)和JayDeBeApi(调用jdbc)。以下是这三种操作方式对GBase 8s数据库的数据类型支持的对比 类型 数据类型 DbtPy Pyodbc JayDeBeApi(jdbc) 字符类型 CHAR(N) 是 是 是 字符类型 NCHAR(N) 是 是 是 字符类型 VARCHAR(N)

    2023年04月09日
    浏览(33)
  • GBase 8s常见问题解析---追踪统计SQL执行情况 SQLTRACE

    本文摘自GBASE南大通用社区,by:wty,原文请点击:GBase 8s常见问题 -- 追踪统计SQL执行情况 SQLTRACE|GBASE社区|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商 问题现象 某些SQL执行慢、有问题,又找不到对应的SQL时,可以尝试使用SQLTRACE来查问

    2024年01月24日
    浏览(36)
  • Gbase8s 如何成为一个更高效的oltp系统

    众所周知,用户的关键业务系统,特别是 OLTP 系统,都要求提供 24X7 不间断的应用服务,这就要求数据库系统能够提供强大的高可用能力。而GBase 8s的目标是实现一个具有完善的事务处理能力的高性能的面向联机事务处理应用的安全数据库系统。因此,在保证系统安全性的前

    2024年02月09日
    浏览(35)
  • Getting started with Java

    : 是Java中被赋予特殊意义的单词, 例如: class 定义了一个模块, 它的代码形式如下: 在class后面紧跟着类名, 类名后的大括号中是类实现的方法 字面量: 数据在程序中的书写格式 字面量类型 说明 举例 整数类型 不带小数点的数字 666, -88 小数类型 带小数点的数字

    2024年04月26日
    浏览(21)
  • QT5.12.12通过ODBC连接到GBase 8s数据库(CentOS)

    本示例使用的环境如下: 硬件平台:x86_64(amd64) 操作系统:CentOS 7.8 2003 数据库版本(含CSDK):GBase 8s V8.8 3.0.0_1 为什么使用QT 5.12.10? 该版本包含QODBC。 1.1,确认操作系统已经安装unixODBC及unixODBC-devel 通过apt查找确认unixODBC及unixODBC-devel已经安装 如果未安装使用apt源进行安装

    2024年02月11日
    浏览(35)
  • Python Project Getting started with Django

    As the internet has evolved , the line between website and mobile apps has blurred. we can use Django to build a single project that serves a dynamic website as well as a set of mobile apps. Django is Python\\\'s most popular web framework, a set of tools designed for building interactive web applications. We will learn how to use Django to build a project call

    2024年04月25日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包