Oracle中connect by...start with...的使用

2023-11-03

一、语法
大致写法:select * from some_table [where 条件1] connect by [条件2] start with [条件3];
其中 connect by 与 start with 语句摆放的先后顺序不影响查询的结果,[where 条件1]可以不需要。
[where 条件1]、[条件2]、[条件3]各自作用的范围都不相同:

[where 条件1]是在根据“connect by [条件2] start with [条件3]”选择出来的记录中进行过滤,是针对单条记录的过滤, 不会考虑树的结构;

[条件2]指定构造树的条件,以及对树分支的过滤条件,在这里执行的过滤会把符合条件的记录及其下的所有子节点都过滤掉;

[条件3]限定作为搜索起始点的条件,如果是自上而下的搜索则是限定作为根节点的条件,如果是自下而上的搜索则是限定作为叶子节点的条件;


示例:

create table AA
(
  ID  NUMBER not null,
  PID NUMBER,
  XM  VARCHAR2(10) not null
);

 

alter table AA
  add constraint PK__AA_ID primary key (ID);

alter table AA
  add constraint FK_AA_PID foreign key (PID)
  references AA (ID);

 

表AA中的数据如下:

ID  PID XM

1          A  
2    1    B1 
3    1    B2
4    2    C1
5    2    C2
6    3    C3
7    3    C4

 

查询获取ID=1的所有子节点记录

select id,xm from aa t connect by prior  t.id = t.pid  start with t.id=1;

注意:

 prior  t.id = t.pid 为自父节点开始向下寻找所有子节点;

 prior  t.pid = t.id 为自本节点开始向上寻找所有父节点;

 

二、执行原理
tconnect by...sart with...的执行原理可以用以下一段程序的执行以及对存储过程RECURSE()的调用来说明:

/* 遍历表中的每条记录,对比是否满足start with后的条件,如果不满足则继续下一条,
如果满足则以该记录为根节点,然后调用RECURSE()递归寻找该节点下的子节点,
如此循环直到遍历完整个表的所有记录 。*/
for rec in (select * from some_table) loop
if FULLFILLS_START_WITH_CONDITION(rec) then
    RECURSE(rec, rec.child);
end if;
end loop;

/* 寻找子节点的存储过程*/
procedure RECURSE (rec in MATCHES_SELECT_STMT, new_parent IN field_type) is
begin
APPEND_RESULT_LIST(rec); /*把记录加入结果集合中*/
/*再次遍历表中的所有记录,对比是否满足connect by后的条件,如果不满足则继续下一条,
如果满足则再以该记录为根节点,然后调用RECURSE()继续递归寻找该节点下的子节点,
如此循环直到找至叶子节点。*/
for rec_recurse in (select * from some_table) loop
    if FULLFILLS_CONNECT_BY_CONDITION(rec_recurse.child, new_parent) then
      RECURSE(rec_recurse,rec_recurse.child);
    end if;
end loop;
end procedure RECURSE;

 

 

 

参考了艾蛋蛋在JavaEye上的发言

  http://maruibenze.javaeye.com/blog/208541

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle中connect by...start with...的使用 的相关文章

  • Oracle - 仅当不存在时才创建索引

    有没有什么方法可以在oracle中创建索引 只有当它们不存在时 就像是 CREATE INDEX IF NOT EXISTS ord customer ix ON orders customer id 仅当索引不存在时添加索引 declar
  • 想要从字符格式转换为带小数的数字格式

    想要将字符格式 00001000000 转换为10000 00 请帮我 我已经尝试过 select to number 00012300 9999999999 99 nls numeric characters from dual 这个脚本
  • oracle日期序列?

    我有一个 oracle 数据库 我需要一个包含 2 年所有日期的表 例如来自01 01 2011 to 01 01 2013 首先我想到了一个序列 但显然唯一支持的类型是数字 所以现在我正在寻找一种有效的方法来做到这一点 欢呼骗局 如果您想
  • 从 Oracle Varchar2 中查找并删除非 ASCII 字符

    我们目前正在将一个 Oracle 数据库迁移到 UTF8 并且发现一些记录接近 4000 字节 varchar 限制 当我们尝试迁移这些记录时 它们会失败 因为它们包含的字符变成了多字节 UF8 字符 我想要在 PL SQL 中做的是找到这
  • 用C++连接oracle数据库

    我正在寻找一种方法来连接到远程 Oracle 数据库并从 C 控制台应用程序中的表中读取一些数据 有人可以给我一些提示吗 谢谢 soci http soci sourceforge net http soci sourceforge net
  • 检查多个变量java中的替换空值

    我试图找到一种简单的方法来在 Java 中的多个变量中执行多个 null 检查 替换 我有一个包含大约 20 个字符串变量的对象 在构造函数中 我想检查是否有任何变量值为空 如果它们为空 我想用空字符串替换它们 我可以执行一系列 if 语句
  • 如何列出表中的所有列?

    对于各种流行的数据库系统 如何列出表中的所有列 对于 MySQL 请使用 DESCRIBE name of table 只要您使用 SQL Plus 或 Oracle 的 SQL Developer 这也适用于 Oracle
  • 如何使用低权限的 PL-SQL 获取 Oracle 中的列数据类型?

    我对 Oracle 数据库中的一些表具有 只读 访问权限 我需要获取某些列的架构信息 我想使用类似于 MS SQL 的东西sp help 我看到此查询中列出了我感兴趣的表 SELECT FROM ALL TABLES 当我运行这个查询时 O
  • simpleJdbcCall 调用 Pl/SQL 过程 -- ORA-22922 不存在的 LOB 值

    我收到此 SQLException ORA 22922 不存在的 LOB 值 我的场景是 我正在调用一个采用结构数组的过程 该结构体包含三种类型 两种是日期 一种是 Clob 当我使用 Spring 的 simpleJdbcCall 设置
  • 如何修复“Oracle.EntityFrameworkCore 类型中的方法‘get_Info’没有实现”。

    我正在尝试通过 EW 连接到 Oracle DB 论方法OnConfiguring是错误 System TypeLoadException 程序集 Oracle EntityFrameworkCore Version 2 0 19 1 Cu
  • 什么会导致 Oracle ROWID 更改?

    AFAIK Oracle 中的 ROWID 表示相应数据文件中记录的物理位置 在什么情况下记录的ROWID可能会改变 我所知道的一个是分区表上的更新 它将记录 移动 到另一个分区 还有其他情况吗 我们的大多数数据库都是 Oracle 10
  • 如何在c中的某个位置终止字符指针?

    我试图通过设置空终止符来终止 c 中的字符指针 在特定位置 例如 如果我有一个 char 指针 char hi hello 我希望它是 hell 通过设置o为空 我尝试过使用 strcpy 来执行此操作 例如 strcpy hi 4 0 但
  • 如何检查oracle数据库中分配给模式、角色的对象的权限(DDL、DML、DCL)?

    大多数时候 我们都在与愚蠢的事情作斗争 以获取架构 角色及其对象的权限详细信息 并尝试找到一些简单的方法来获取有关它的所有详细信息以及伪查询代码 以批量生成授予语句以供进一步使用执行 所以我们在这里得到它 关于数据字典视图前缀的一些简单介绍
  • 如何计算选择查询的最佳获取大小

    在 JDBC 中 默认获取大小为 10 但我想当我有一百万行时 这不是最佳获取大小 据我所知 获取大小太低会降低性能 但如果获取大小太高也会降低性能 我怎样才能找到最佳尺寸 这对数据库端有影响吗 它会占用大量内存吗 如果您的行很大 请记住
  • 根据由另一列分组的不同列的最大值获取值[重复]

    这个问题在这里已经有答案了 我想根据由另一列分组的不同列的最大值来获取列的值 我有这张表 KEY NUM VAL A 1 AB B 1 CD B 2 EF C 2 GH C 3 HI D 1 JK D 3 LM 并想要这样的结果 KEY V
  • 以编程方式插入行(父行和子行)

    我正在使用 Spring 和 JDBCTemplate 该场景是 CUSTOMER 表和 ORDERS 表的父子关系 我想做一个插入 例如 1 个客户和 5 个订单 但我不确定如何以编程方式在 CUSTOMER 表中插入一行 如何获取 Or
  • 插入具有多个值的外键

    我想知道 是否有可能创建一个表 其中我有一个接受外键但同一行可能有多个值的表 例如 Employee id name skillid Skill Skillid skillname 这里 Employee 的一个例子可以是 Employee
  • 如何检查 BOOL 是否为空?

    有没有办法在将值分配给 BOOL 之前检查该值是否为 NULL Nil 例如 我在 NSDictionary 中有一个值可以是 TRUE FALSE NULL mySTUser current user following results
  • json_encode 返回 NULL?

    由于某种原因 项目 描述 返回NULL使用以下代码 这是我的数据库的架构 CREATE TABLE staff id int 11 NOT NULL AUTO INCREMENT name longtext COLL
  • 是否可以从子查询中获取多个值?

    有没有办法让子查询在oracle db中返回多列 我知道这个特定的sql会导致错误 但它很好地总结了我想要的 select a x select b y b z from b where b v a v from a 我想要这样的结果 a

随机推荐

  • 代码管理工具github+git+tortoisegit下载

    GitHub是世界上最大的代码托管平台 是程序员的必备神器 Git 是一个开源的分布式版本控制系统 用于敏捷高效地处理任何或小或大的项目 tortoisegit是一款开源的git的版本控制系统 也叫海龟git TortoiseGit的安装和
  • Session 简介及绑定

    session是什么 其实session是一个存在服务器上的类似于一个散列表格的文件 里面存有我们需要的信息 在我们需要用的时候可以从里面取出来 说起session的作用 简单的举个例子 我们在登录某些网站的时候 输入了用户名密码 登录以后
  • GTest测试框架使用

    Gtest框架简介 Gtest是Google Test的简称 是Google开发的C 单元测试框架 适用于多个平台 Liunx Mac OS X Windows Cygwin Windows CE and Symbian PlatformI
  • OpenWrt-uci脚本命令

    转自 http developer t firefly com thread 1035 1 1 html 目录 1 UCI命令 2 UCI的文件和流程 3 UCI 的文件语法 4 UCI 命令读写配置 5 综合实例 1 UCI命令 一个众所
  • 国内知名公共DNS服务器 IP

    国内知名公共 DNS 服务器 IP 腾讯 DNS 119 29 29 29 182 254 116 116 阿里 DNS 223 5 5 5 223 6 6 6 百度 DNS 180 76 76 76 114DNS 114 114 114
  • osg学习(六十八)序列化插件加载过程

    加载D OSG OAGEARTH x86 bin osgPlugins 3 6 3 osgdb serializers osgd dll
  • 微信小程序 公众号 订阅消息 模板 正则 参数校验

    自己配置订阅消息模板 如果参数格式不正确 会导致订阅消息发不出去 所以在创建模板的时候需要校验参数格式 订阅通知参数值内容限制说明 微信官方文档 创建模板 代码
  • qt 信号发送太快,槽太慢的解决办法

    手机码字太慢 自己看 ifndef THREADTEST H define THREADTEST H include include include include class ThreadTest public QObject Q OBJ
  • 职业规划-IT方向(超详细,超具体)

    前言 今天是周五 本来想好好休息 前天写了一篇博文 说出我的故事 献给正在迷茫的你 不少读者留言不知该如何做职业规划 于是继续拖着忙碌了一周疲倦的身体 坐在电脑前 吹着电扇 提笔写下这篇 职业规划 IT方向 如果你是应届生 或者准备转行 I
  • Django项目想要在 Python Console里面进行操作 报错找不到对应模块

    Django项目想要在 Python Console里面进行操作 报错找不到对应模块 问题描述 ModuleNotFoundError No module named django 问题原因 在进行对 Python console操作 进行
  • 6.1-深度学习简介

    文章目录 一 深度学习的三个步骤 1 1 全连接前馈网络 Fully Connect Feedforward Network 1 2 矩阵运算 Matrix Operation 1 3 手写数字辨识 二 确定评价函数 goodness of
  • 静电电容

    1 用电容进行ESD的防护只能用数pF到数百pF的小电容 这里关注的不是容量而是串联等效电感参数 静电放电极快 对应极高的频率 耐压的问题不用考虑 因为静电源内阻极高 能量很小 放电时电压跌落极快 2 理论上讲大电容并不会因为时间常数的增加
  • ❤echarts折线图完整使用及详细配置参数

    echarts折线图完整使用及详细配置参数 进入echarts官网 查看案例 下面说说一些echarts图的调节 一 配置echarts具体参数 01 基础版本的折线图 option xAxis type category data Mon
  • 将gif图转成静态图片显示canvas

    需求描述 仅一张gif动图 进入页面 呈现静态图片显示 点击 gif图显示 代码实现
  • uniapp全局分享以及指定页面分享禁用的设置

    1 创建share js文件 module exports onLoad 设置默认的转发参数 share title 默认为小程序名称 path 默认为当前页面路径 imageUrl 默认为当前页面的截图 白名单 const urlList
  • Apollo学习笔记

    Apollo学习笔记 Apollo课程 智能驾驶入门课程 无人驾驶概览 1 软件层分为三层 实时操作系统 RTOS 确保在给定时间内完成特定任务 实时时确保系统稳定性 驾驶安全性的重要要求 通过在Ubuntu Linux操作系统加入Apol
  • 带有Cookie功能的HTTP访问函数,GET,PUT/POST

    define AFX INET SERVICE FTP INTERNET SERVICE FTP define AFX INET SERVICE HTTP INTERNET SERVICE HTTP define AFX INET SERV
  • Oracle删除数据的三种方式

    Oracle删除数据的三种方法 删除表 记录和结构 的语句delete truncate drop drop命令 drop table 表名 例如 删除学生表 student drop table student 注意 1 用drop删除表
  • node.js学习——初始node,node基本介绍,环境安装,运行第一个node程序。

    node js学习 初始node node基本介绍 环境安装 运行第一个node程序 1 node基本介绍 为什么学习Node js 什么是node js Node js的特性 Node js能做什么 2 Node环境安装 环境安装 3 第
  • Oracle中connect by...start with...的使用

    一 语法 大致写法 select from some table where 条件1 connect by 条件2 start with 条件3 其中 connect by 与 start with 语句摆放的先后顺序不影响查询的结果 wh