为什么80%的码农都做不了架构师?>>>   

oracle中可以用CONNECT BY子句实现递归查询,其基本语法是:

select ... from <TableName>
where <Conditional-1>
start with <Conditional-2>
connect by [nocycle]<Conditional-3>
order siblings by <conditional-4>;

<Conditional-1>:过滤条件,用于对返回的所有记录进行过滤。(关联条件和过滤条件有区别,关联条件最先执行)
<Conditional-2>:根节点条件,只用于第一次过滤出根节点。
<Conditional-3>:连接条件,nocycle关键字,防止循环;prior操作符,用于层级条件,没有prior操作符不会发生层级关联,一个connect by语句中可以有多个prior条件,也可以有其他普通条件,但是prior不能用于sequence序列。
<conditional-4>:同级节点排序条件。

执行顺序:
1、语句中有多表关联,先执行关联,无论是join还是where条件中的关联条件。
2、执行start with的条件,选出第一个节点。
3、执行connect by 的条件,层级关联,选出子节点。
4、执行where中的过滤条件,排除结果集中不满足条件的记录,但是不会因为排除一条记录而把它对应的子节点排除。
5、执行order siblings by的排序条件,对同级节点排序。

伪劣:
level:标记层级级数,最上层节点为1,之后为2、3……。
CONNECT_BY_ISCYCLE:标记此节点是否为某一个祖先节点的父节点,导致循环,1为是,0为否。
CONNECT_BY_ISLEAF :标记此节点是否为叶子节点,即没有子节点,1为是,0为否。
CONNECT_BY_ROOT:标记此节点的祖先节点,后面加列名或表达式,取祖先节点的记录值。

SYS_CONNECT_BY_PATH(column,char) 函数:记录根节点到此节点的路径,column是每个节点的路径值,以char分割。column和char都必须是char,varchar2,nchar,或者nvarchar2。
例如:LPAD(' ', 2*level-1)||SYS_CONNECT_BY_PATH(last_name, '/') "Path"表示以last_name为路径,'/'分割,记录根到节点的全路径。lpad是优化显示。

(以下来自网上)例子:

select a.child,a.parent,level "层次",sys_connect_by_path(child, '->') "合并层次",prior a.child "父节点",connect_by_root a.child "根节点",decode(connect_by_isleaf, 1, a.child, null) "子节点",decode(connect_by_isleaf, 1, '是', '否') "是否子节点"
from test_connect_by a
start with a.parent is null --从parent为空开始扫描
connect by prior a.child = a.parent --以child为父列连接parent
order siblings by child desc --对层次排序
;

一个特殊的使用,使用connect  by rownum<=N可以使表的第一行重复N次,如果无记录则无效果:
生成1到10的序列:

SQL> SELECT ROWNUM FROM DUAL CONNECT BY ROWNUM <= 10;
ROWNUM ----------
1
2
3
4
5
6
7
8
9
10 10 rows selected

借助这个功能,拆分字符串的每一个字符:

CREATE OR REPLACE FUNCTION f_hex_to_dec(p_str IN VARCHAR2) RETURN VARCHAR2 IS---------------------------------------------------------------------------------------------------------------------- -- 对象名称: f_hex_to_dec -- 对象描述: 十六进制转换十进制 -- 输入参数: p_str 十六进制字符串 -- 返回结果: 十进制字符串 -- 测试用例: SELECT f_hex_to_dec('78A') FROM dual; ---------------------------------------------------------------------------------------------------------------------- v_return  VARCHAR2(4000); BEGINSELECT SUM(DATA) INTO v_return FROM (SELECT (CASE upper(substr(p_str, rownum, 1)) WHEN 'A' THEN '10'WHEN 'B' THEN '11'WHEN 'C' THEN '12'WHEN 'D' THEN '13'WHEN 'E' THEN '14'WHEN 'F' THEN '15'ELSE substr(p_str, rownum, 1) END) * power(16, length(p_str) - rownum) DATA FROM dual CONNECT BY rownum <= length(p_str)); RETURN v_return; EXCEPTION WHEN OTHERS THENRETURN NULL; END;

转载于:https://my.oschina.net/hulubo/blog/52624

oracle的connect by语句相关推荐

  1. oracle建表语句空间,oracle建表空间语句

    一.能帮我解释一下oracle创建表空间的语句吗 1. 创建表空间,名称为db_name; 2. 表空间有一个数据文件*.dbf,大小为200MB; 3. 允许表空间自动扩展(autoextends) ...

  2. Oracle中分页查询语句

    Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用. ...

  3. Oracle 数据库常用操作语句大全

    原文:Oracle 数据库常用操作语句大全 一.Oracle数据库操作 1.创建数据库      create database databasename 2.删除数据库      drop data ...

  4. oracle 多条执行语句同时执行

    oracle 多条执行语句同时执行:begin 语名一;语句二; end; 注意 如果写在C#里千万不要用@的方法然后语句里有回车 例: string strSql = "begin upd ...

  5. SQL Server,Oracle,DB2索引建立语句的对比

    http://database.51cto.com/art/201108/284540.htm SQL Server,Oracle,DB2索引建立语句的对比 2011-08-17 20:48 henr ...

  6. oracle维护常用SQL语句(查看系统表和视图)

    转:http://www.360doc.com/content/11/1230/15/7489308_176090474.shtml oracle维护常用SQL语句(查看系统表和视图) 1.查看表空间 ...

  7. Linux系统中Oracle数据库使用SELECT语句检索数据(1)实例应用

    Linux系统中Oracle数据库使用SELECT语句检索数据(1)实例应用 1,首先切换到Oracle用户,并进入数据库#sql / as sysdba2,启动数据库,并连接样例及表格,启动命令#s ...

  8. oracle 插入一个语句,oracle如何通过1条语句插入多个值 oracle通过1条语句插入多个值方法...

    本篇文章小编给大家分享一下oracle通过1条语句插入多个值方法,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 在实践过程中遇到一个问题, 我想往数据库插入多条数据时,使用 ...

  9. Oracle]高效的SQL语句之分析函数

    [Oracle]高效的SQL语句之分析函数(一)--sum() 实际应用中我们可以通过sum()统计出组中的总计或者是累加值,具体示例如下: 1.创建演示表 create table emp as s ...

最新文章

  1. 【Design pattern】设计模式思路总结(三)
  2. java枚举可以int值不_java – 如何通过int值迭代枚举?
  3. textarea怎么占满整个td_保健品为什么偏偏盯上老人?作为子女,应怎么面对老人狂买保健品...
  4. docker挂载本地目录_Docker:使用本地卷和tmpfs挂载
  5. HTTP错误500.30——ANCM进程内启动失败——.NET Core
  6. python3.7 倒计时
  7. 二叉树的高度_完全二叉树的子节点数
  8. iconv命令与函数
  9. php网站安装有密钥,win10安装时跳过密钥
  10. 电容或电感的电压_磁场对于电感路径检测的影响
  11. Wordpress主题制作基础教程
  12. cdr多页面排版_cdr排版实例图文教程,教你CorelDRAW杂志内页排版方法
  13. 易到实际控制人温晓东成老赖:与贾跃亭曾是盟友 如今反目
  14. ubuntu20.04安装并运行ORB_SLAM3(一路顺风版)
  15. Win7系统还原,创建还原点,永久保存自定义还原点,不被删除
  16. 百度搜索下拉框及百度相关搜索中刷关键字方法
  17. matlab 读取bin文件显示图片
  18. linux 运行 epics,EPICS的安装.pdf
  19. java后端和web_从java和web角度分析前端好还是后端好
  20. mysql聚簇和非聚簇索引

热门文章

  1. java web ftp上传_java web FTPClient实现上传文件到指定服务器
  2. python 还原九宫格图片_用Python做一个好玩的朋友圈九宫格抽奖
  3. Python requests 笔记(一)
  4. ubtunu查看服务器信息,ubuntu查看服务器地址
  5. java json.pasent_来自CSV的带有id parent(Python)的JSON树
  6. 《系统集成项目管理工程师》必背100个知识点-23整体变更控制流程
  7. 笔记-项目质量管理-6σ管理法
  8. UltraVNC反向连接方式的使用
  9. Android中使用Notification在状态栏上显示通知
  10. VUE—从入门到飞起(一)