Oracle树查询及相关函数

树莓派视觉小车实战:OpenCV驱动的智能物体追踪系统 本文详细介绍了如何从零开始构建一个基于树莓派的智能视觉小车,实现物体跟踪功能。通过OpenCV进行图像处理,结合颜色与轮廓识别算法,让小车能够实时锁定并追踪特定目标。内容涵盖硬件搭建、软件环境配置、核心代码解析及运动控制逻辑,为创客和开发者提供了完整的实战指南。 阅读详情

Oracle树查询及相关函数

Sql代码

  1. CREATE TABLE FLFL   
  2. (   
  3.   ID      NUMBER                                NOT NULL,   
  4.   MC      NVARCHAR2(20),   
  5.   FLJB    NUMBER,   
  6.   SJFLID  NUMBER   
  7. )  

CREATE TABLE FLFL

(

  ID      NUMBER                                NOT NULL,

  MC      NVARCHAR2(20),

  FLJB    NUMBER,

  SJFLID  NUMBER

)

      FLJB是作为树的级别,在很多查询中可以加快SQL的查询效率。在下面演示的功能基本上不使用这个关键字。

      SJFLID存储的是上级ID,如果是顶级父节点,该SJFLID为null(得补充一句,当初的确是这样设计的,不过现在知道,表中最好别有null记录,这会引起全文扫描,建议改成0代替)。

      我们从最基本的操作,逐步列出树查询中常见的操作,所以查询出来的节点以家族中的辈份作比方。

 

      1. 查找树中的所有顶级父节点(辈份最长的人)。 假设这个树是个目录结构,那么第一个操作总是找出所有的顶级节点,再根据该节点找到其下属节点。

Sql代码

  1. SELECT * FROM flfl WHERE sjflid IS NULL;  

SELECT * FROM flfl WHERE sjflid IS NULL;

      这是个引子,没用到树型查询。

 

      2.查找一个节点的直属子节点(所有儿子)。 如果查找的是直属子类节点,也是不用用到树型查询的。

Sql代码

  1. SELECT * FROM flfl WHERE sjflid = 819459;  

SELECT * FROM flfl WHERE sjflid = 819459;

      这个可以找到ID为819459的直属子类节点。

 

      3.查找一个节点的所有 直属子节点(所有后代)。

Sql代码

  1. SELECT * FROM flfl START WITH ID = 819459 CONNECT BY sjflid = PRIOR ID;  

SELECT * FROM flfl START WITH ID = 819459 CONNECT BY sjflid = PRIOR ID;

      这个查找的是ID为819459的节点下的所有直属子类节点,包括子辈的和孙子辈的所有直属节点。

 

      4.查找一个节点的直属父节点(父亲)。如果查找的是节点的直属父节点,也是不用用到树型查询的。

Sql代码

  1. SELECT b.* FROM flfl a JOIN flfl b ON a.sjflid = b.ID WHERE a.ID = 6758;  

SELECT b.* FROM flfl a JOIN flfl b ON a.sjflid = b.ID WHERE a.ID = 6758;

      这个找到的是ID为6758的节点的直属父节点,要用到同一张表的关联了。

 

      5.查找一个节点的所有直属父节点(祖宗)。

Sql代码

  1. SELECT * FROM flfl START WITH ID = 6758 CONNECT BY PRIOR sjflid = ID;  

SELECT * FROM flfl START WITH ID = 6758 CONNECT BY PRIOR sjflid = ID;

      这里查找的就是ID为6758的所有直属父节点,打个比方就是找到一个人的父亲、祖父等。但是值得注意的是这个查询出来的结果的顺序是先列出子类节点再列出父类节点,姑且认为是个倒序吧。

 

      上面列出两个树型查询方式,第3条语句和第5条语句,这两条语句之间的区别在于prior关键字的位置不同,所以决定了查询的方式不同。 当sjflid = PRIOR ID时,数据库会根据当前的ID迭代出sjflid与该ID相同的记录,所以查询的结果是迭代出了所有的子类记录;而PRIOR ID = sjflid时,数据库会跟据当前的sjflid来迭代出与当前的sjflid相同的id的记录,所以查询出来的结果就是所有的父类结果。

      以下是一系列针对树结构的更深层次的查询,这里的查询不一定是最优的查询方式,或许只是其中的一种实现而已。

 

      6.查询一个节点的兄弟节点(亲兄弟)。

Sql代码

  1. SELECT a.*   
  2.   FROM flfl a   
  3.  WHERE EXISTS (SELECT *   
  4.                  FROM flfl b   
  5.                 WHERE a.sjflid = b.sjflid AND b.ID = 6757);  

SELECT a.*

  FROM flfl a

 WHERE EXISTS (SELECT *

                 FROM flfl b

                WHERE a.sjflid = b.sjflid AND b.ID = 6757);

      这里查询的就是与ID为6757的节点同属一个父节点的节点了,就好比亲兄弟了。

 

      7.查询与一个节点同级的节点(族兄弟)。 如果在表中设置了级别的字段,上表中的FLJB,那么在做这类查询时会很轻松,同一级别的就是与那个节点同级的,在这里列出不使用该字段时的实现!

Sql代码

  1. WITH tmp AS  
  2.      (SELECT     a.*, LEVEL lev   
  3.             FROM flfl a   
  4.       START WITH a.sjflid IS NULL  
  5.       CONNECT BY a.sjflid = PRIOR a.ID)   
  6. SELECT *   
  7.   FROM tmp   
  8.  WHERE lev = (SELECT lev   
  9.                 FROM tmp   
  10.                WHERE ID = 819394)  

WITH tmp AS

     (SELECT     a.*, LEVEL lev

            FROM flfl a

      START WITH a.sjflid IS NULL

      CONNECT BY a.sjflid = PRIOR a.ID)

SELECT *

  FROM tmp

 WHERE lev = (SELECT lev

                FROM tmp

               WHERE ID = 819394)

       这里使用两个技巧,一个是使用了LEVEL来标识每个节点在表中的级别,还有就是使用with语法模拟出了一张带有级别的临时表。

 

      8.查询一个节点的父节点的的兄弟节点(伯父与叔父)。

Sql代码

  1. WITH tmp AS  
  2.      (SELECT     flfl.*, LEVEL lev   
  3.             FROM flfl   
  4.       START WITH sjflid IS NULL  
  5.       CONNECT BY sjflid = PRIOR ID)   
  6. SELECT b.*   
  7.   FROM tmp b,   
  8.        (SELECT *   
  9.           FROM tmp   
  10.          WHERE ID = 7004 AND lev = 2) a   
  11.  WHERE b.lev = 1   
  12. UNION ALL  
  13. SELECT *   
  14.   FROM tmp   
  15.  WHERE sjflid = (SELECT DISTINCT x.ID   
  16.                             FROM tmp x,   
  17.                                  tmp y,   
  18.                                  (SELECT *   
  19.                                     FROM tmp   
  20.                                    WHERE ID = 7004 AND lev > 2) z   
  21.                            WHERE y.ID = z.sjflid AND x.ID = y.sjflid);  

WITH tmp AS

     (SELECT     flfl.*, LEVEL lev

            FROM flfl

      START WITH sjflid IS NULL

      CONNECT BY sjflid = PRIOR ID)

SELECT b.*

  FROM tmp b,

       (SELECT *

          FROM tmp

         WHERE ID = 7004 AND lev = 2) a

 WHERE b.lev = 1

UNION ALL

SELECT *

  FROM tmp

 WHERE sjflid = (SELECT DISTINCT x.ID

                            FROM tmp x,

                                 tmp y,

                                 (SELECT *

                                    FROM tmp

                                   WHERE ID = 7004 AND lev > 2) z

                           WHERE y.ID = z.sjflid AND x.ID = y.sjflid);

       这里查询分成以下几步。首先,将第7个一样,将全表都使用临时表加上级别;其次,根据级别来判断有几种类型,以上文中举的例子来说,有三种情况:(1)当前节点为顶级节点,即查询出来的lev值为1,那么它没有上级节点,不予考虑。(2)当前节点为2级节点,查询出来的lev值为2,那么就只要保证lev级别为1的就是其上级节点的兄弟节点。(3)其它情况就是3以及以上级别,那么就要选查询出来其上级的上级节点(祖父),再来判断祖父的下级节点都是属于该节点的上级节点的兄弟节点。 最后,就是使用UNION将查询出来的结果进行结合起来,形成结果集。

 

      9.查询一个节点的父节点的同级节点(族叔)。

      这个其实跟第7种情况是相同的。

Sql代码

  1. WITH tmp AS  
  2.      (SELECT     a.*, LEVEL lev   
  3.             FROM flfl a   
  4.       START WITH a.sjflid IS NULL  
  5.       CONNECT BY a.sjflid = PRIOR a.ID)   
  6. SELECT *   
  7.   FROM tmp   
  8.  WHERE lev = (SELECT lev   
  9.                 FROM tmp   
  10.                WHERE ID = 819394) - 1  

WITH tmp AS

     (SELECT     a.*, LEVEL lev

            FROM flfl a

      START WITH a.sjflid IS NULL

      CONNECT BY a.sjflid = PRIOR a.ID)

SELECT *

  FROM tmp

 WHERE lev = (SELECT lev

                FROM tmp

               WHERE ID = 819394) - 1

      只需要做个级别判断就成了。

 

      基本上,常见的查询在里面了,不常见的也有部分了。其中,查询的内容都是节点的基本信息,都是数据表中的基本字段,但是在树查询中还有些特殊需求,是对查询数据进行了处理的,常见的包括列出树路径等。

      补充一个概念,对于数据库来说,根节点并不一定是在数据库中设计的顶级节点,对于数据库来说,根节点就是start with开始的地方。

      下面列出的是一些与树相关的特殊需求。

 

      10.名称要列出名称全部路径。

      这里常见的有两种情况,一种是是从顶级列出,直到当前节点的名称(或者其它属性);一种是从当前节点列出,直到顶级节点的名称(或其它属性)。举地址为例:国内的习惯是从省开始、到市、到县、到居委会的,而国外的习惯正好相反(老师说的,还没接过国外的邮件,谁能寄个瞅瞅 )。

      从顶部开始:

Sql代码

  1. SELECT     SYS_CONNECT_BY_PATH (mc, '/')   
  2.       FROM flfl   
  3.      WHERE ID = 6498   
  4. START WITH sjflid IS NULL  
  5. CONNECT BY sjflid = PRIOR ID;  

SELECT     SYS_CONNECT_BY_PATH (mc, '/')

      FROM flfl

     WHERE ID = 6498

START WITH sjflid IS NULL

CONNECT BY sjflid = PRIOR ID;

      从当前节点开始:

Sql代码

  1. SELECT     SYS_CONNECT_BY_PATH (mc, '/')   
  2.       FROM flfl   
  3. START WITH ID = 6498   
  4. CONNECT BY PRIOR sjflid = ID;  

SELECT     SYS_CONNECT_BY_PATH (mc, '/')

      FROM flfl

START WITH ID = 6498

CONNECT BY PRIOR sjflid = ID;

      在这里我又不得不放个牢骚了。oracle只提供了一个sys_connect_by_path函数,却忘了字符串的连接的顺序。在上面的例子中,第一个SQL是从根节点开始遍历,而第二个SQL是直接找到当前节点,从效率上来说已经是千差万别,更关键的是第一个SQL只能选择一个节点,而第二个SQL却是遍历出了一颗树来。再次PS一下。

      sys_connect_by_path函数就是从start with开始的地方开始遍历,并记下其遍历到的节点,start with开始的地方被视为根节点,将遍历到的路径根据函数中的分隔符,组成一个新的字符串,这个功能还是很强大的。

 

      11.列出当前节点的根节点。

      在前面说过,根节点就是start with开始的地方。

Sql代码

  1. SELECT     CONNECT_BY_ROOT mc, flfl.*   
  2.       FROM flfl   
  3. START WITH ID = 6498   
  4. CONNECT BY PRIOR sjflid = ID;  

SELECT     CONNECT_BY_ROOT mc, flfl.*

      FROM flfl

START WITH ID = 6498

CONNECT BY PRIOR sjflid = ID;

      connect_by_root函数用来列的前面,记录的是当前节点的根节点的内容。

 

      12.列出当前节点是否为叶子。

      这个比较常见,尤其在动态目录中,在查出的内容是否还有下级节点时,这个函数是很适用的。

Sql代码

  1. SELECT     CONNECT_BY_ISLEAF, flfl.*   
  2.       FROM flfl   
  3. START WITH sjflid IS NULL  
  4. CONNECT BY sjflid = PRIOR ID;  

SELECT     CONNECT_BY_ISLEAF, flfl.*

      FROM flfl

START WITH sjflid IS NULL

CONNECT BY sjflid = PRIOR ID;

      connect_by_isleaf函数用来判断当前节点是否包含下级节点,如果包含的话,说明不是叶子节点,这里返回0;反之,如果不包含下级节点,这里返回1。

 

      至此,oracle树型查询基本上讲完了,以上的例子中的数据是使用到做过的项目中的数据,因为里面的内容可能不好理解,所以就全部用一些新的例子来进行阐述。以上所有SQL都在本机上测试通过,也都能实现相应的功能,但是并不能保证是解决这类问题的最优方案(如第8条明显写成存储过程会更好),如果谁有更好的解决方案、或者有关oracle树查询的任何问题,欢迎留言讨论,以上的SQL有什么问题也欢迎大家留言批评。

VC中sqlite的使用 在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示 立即下载

相关推荐

亚马逊广告接口 amazon advertising

亚马逊广告接口官方说明:https://advertising.amazon.com/API/docs/en-us/setting-up/account-setup 一:注册aws开发者账号 注册地址:https://developer.amazon.com 二:填写注册资料 三:进入控制台,生成安全配置文件 进入 Login with Amazon 菜单: 创建配置文件: 四:申请广告接入权限 申请地址:https://advertising.amazon.com/zh-cn/about-api

lzy66666的博客 4776

Oracle中的树形查询及伪列

Oracle中的树形查询及伪列

m0_71406734的博客 5276

From Manual to Magic: How nnU-Net is Revolutionizing Biomedical Image Segmentation Without Human Int

本文探讨了nnU-Net如何通过全自动深度学习技术革新生物医学图像分割领域。作为自我配置的智能系统,nnU-Net无需人工干预即可完成从数据预处理到模型训练的全流程,显著提升医学影像分割的效率和精度,尤其在CT和MRI影像分析中表现卓越。

metal的博客 1085

Oracle 树操作、递归查询(select…start with…connect by…prior)

Oracle 树操作、递归查询(select…start with…connect by…prior) 一、Oracle中start with…connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: select … from tablename where 条件1, 可选; connect by 条件2,是连接条件,其中用PRIOR表示上一条记录,...

9142

基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第二篇)软硬件参数调试

基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第二篇) 本文内容大部分来自Kris,我们的K大,在VTOL领域的大牛,在此,非常感谢K大。能引用K大的成果也是自己的荣幸,不便之处还请K大多多包涵,在此引用只是为方便自己日常学习,部分参数表里根据自身情况,增加了修改环节和相应参数。 垂直起降固定翼 中文教程-参数设置 垂直起降固定翼是由 多轴+...

u011322358的博客 2万+

计算机视觉与深度学习 | 2024年至2025年图像匹配算法总结(原理,公式,代码,开源链接)

以上总结覆盖了当前主流和前沿技术,实际选择需结合具体场景(速度/精度/资源限制)评估。

尘世冰封的专栏 1595

ORACLE树结构查询

这里我们以一张简单的行政区划表为例进行展示,在实际使用过程中,可以为其添加其他描述字段以及层级。条件3---链接条件,目的就是给出父子之间的关系是什么,根据这个关系进行递归查询(在上述表中就是ID=PID)条件2---根节点的限定条件,固然也可以放宽权限得到多个根节点,也就是获取多个树。2、查询青岛市的下一级子节点(注意和上面区分,全部子节点和下一级子节点)说明:条件1---过滤条件,对全部返回的记录进行过滤。其中ID为1的为山东省节点,查询结果如下。1、查询山东省下面的所有子节点。

紫夜的博客 1926

RK3588芯片CAN总线调试秘籍:SocketCAN与错误帧攻略

RK3588芯片在嵌入式领域凭借8nm工艺和强大性能成为核心控制器。本文详细介绍了其CAN总线配置流程,包括硬件连接、内核驱动配置及SocketCAN命令操作,并深入解析了CAN通信中的错误帧机制及分析方法。通过智能工厂案例,展示了从问题定位到解决方案的全过程,强调了稳定通信对工业应用的重要性。文章为RK3588的CAN总线应用提供了实用技术参考,并对未来智能诊断技术在该领域的应用进行了展望。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 520

Oracle递归查询树形数据

start with connect by prior递归查询 1、start with 子句:遍历起始条件。 2、connect by prior 子句:连接条件。 3、order by 子句:排序。

weixin_40017062的博客 5544

「JS逆向三百例」JS逆向HIKVISION-视频监控的前端密码加密

本文详细分析了HIKVISION-海康威视监控前端登录过程中密码的加密机制,通过逆向工程解析了其 JavaScript 加密逻辑,重点研究了HIKVISION-海康威视监控的前端密码SHA256加密算法的实现。基于逆向分析结果,使用 Python 模拟了HIKVISION-海康威视监控的登录流程,最终实现了自动化登录功能。本文旨在为安全研究人员提供技术参考,帮助理解前端加密机制,并强调技术研究的合法性和合规性。

布啦啦 1100

量化交易 米筐 多因子合成(回测中使用)

多因子合成 1、因子合成 将一些相关(高、低)的因子合成一个因子 方法: 使用PCA方式(使用于较强相关性) 2、核心代码 将因子 inc_revenue_ttm 和 operating_revenue_growth_ratio_ttm 合成为一个因子 inc_operating from sklearn.decomposition import PCA pca = PCA(n_components=1) # 因子合并 fund['inc_operating'] = pca.fit_transform(fu

廷益_飞鸟的博客 1063

Oracle树查询总结

一、简介 在实际项目中,经常会遇到各种级联选择器、各种多级菜单等等,这些数据通常都要在前端展示,在oracle中提供了树查询语法,可以很方便的实现查找父子节点、子父节点、祖父节点等等。 要实现树查询,需要用到如下语句: select … from 数据表名称 start with 条件1 --树遍历开始节点 connect by 条件2 --连接条件 where 条件3; --对树...

weixiaohuai的博客 1534

大数据分析利器:Tableau实战教程从入门到精通

你有3家分店,每月收集1000条销售数据(日期、分店、口味、销售额、订单数);想用Excel分析“哪家分店最赚钱”,但要做透视表→改格式→画柱状图,耗时30分钟,还经常因为公式错误返工;想看看“草莓味奶茶的月度销量趋势”,得手动筛选数据、调整折线图轴范围,稍不注意就漏看关键节点;想把分析结果分享给合伙人,Excel表格太抽象,对方盯着数字问“你到底想告诉我什么?

AI架构师小马 1497

树查询oracle,Oracle树查询及相关函数

Oracle树查询及相关函数以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Oracle树查询的最重要的就是select start with connect by prior 语法了 依托于该语法 我们可以将一个表形结构的中以树的顺序列出来 在下面列述了Oracle中树型查询的常用查询方式以及经常使用的与树查询相关的O...

weixin_31174767的博客 440

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: ExtJs ajax调用汇总
下一篇: windows xp操作
良才2015
博客等级 码龄19年 25粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值