精华内容
下载资源
问答
  • oracle递归用法

    2021-05-05 09:42:28
    --测试3:再谈递归入口--需求:根据多个地区名查询器所有下级地区--错误:测试结果让人恼火,原来start with先于where执行,所以这个测试很失败,大家要注意select s.areaname from s_coalarea_test swhere s....

    --测试3:再谈递归入口

    --需求:根据多个地区名查询器所有下级地区

    --错误:测试结果让人恼火,原来start with先于where执行,所以这个测试很失败,大家要注意

    select s.areaname from s_coalarea_test s

    where s.areaname='黑龙江'

    or

    s.areaname = '山西'

    start with

    s.areaname = s.areaname --既然start with只是过滤记录,那么当然我们也可以不在此处过滤,而直接用where过滤的结果了

    connect by prior

    s.aid=s.parentid

    --测试5:递归关键字出现的位置

    --需求:根据地区名称查找其所在省份

    select s.areaname from s_coalarea_test s

    where s.arealevel=1 --对遍历结果进行过滤

    start with --start with 必须出现在where之后,但是可以是where and之间 入下例

    s.areaname='大同'

    connect by prior

    s.parentid=s.aid

    递归变形:

    1.START WITH 可以省略

    比如:SELECT son FROM tree

    CONNECT BY PRIOR son = father;

    此时不指定树的根的话,就默认把Tree整个表中的数据从头到尾遍历一次,每一个数据做一次根,然后遍历树中其他节点信息.

    在这个例子中,上面的sql等价于

    SELECT son FROM tree

    START WITH father IN (爷爷,爸爸,儿子,孙子NB,孙子SB)

    CONNECT BY PRIOR son = father;

    那查询到的结果如下,有很多重复信息的

    爸爸,孙子SB 儿子,孙子SB 孙子NB,孙子SB

    5.还可以加where条件

    我上面说了可以把start with,connect 假装看成where 条件一样.所以在这个sql语句其他地方还可以加其他where 语句,可以看成与递归查询无关.只是对整个结果起过滤作用

    比如

    SELECT son FROM tree WHERE son = '孙子SB'

    START WITH father = '爷爷'

    CONNECT BY PRIOR son = father;

    当然你不能在最后部分加where,不能在connect by最后面再加.

    CONNECT_BY_ISCYCLE

    我们的树状属性一般都是在一条记录中记录一个当前节点的ID和这个节点的父ID来实现。但是,一旦数据中出现了循环记录,如两个节点互为对方父节点,系统就会报ORA-01436错误:

    insert into t_tonedirlib(dirindex,fatherindex,dirname,status) values (666,667,'123',5);

    1 row inserted

    insert into t_tonedirlib(dirindex,status) values (667,666,'456',5);

    1 row inserted

    select dirindex,RPAD(' ',2*(LEVEL-1)) || dirname from t_tonedirlib

    start with fatherindex = 666

    connect by fatherindex = prior dirindex

    ORA-01436: 用户数据中的 CONNECT BY 循环

    10G中,可以通过加上NOCYCLE关键字避免报错。并且通过CONNECT_BY_ISCYCLE属性就知道哪些节点产生了循环:

    select CONNECT_BY_ISCYCLE,dirindex,2*(LEVEL-1)) || dirname

    from t_tonedirlib

    start with fatherindex = 666

    connect by NOCYCLE fatherindex = prior dirindex

    CONNECT_BY_ISCYCLE DIRINDEX FATHERINDEX RPAD(' ',2*(LEVEL-1))||dirname

    ----------------- ---------------- ---------------------------------

    0 667 666 456

    1 666 667 123

    2 rows selected

    以上就是在10G中增强的CONNECT BY了。当然对于这些增强特性的作用肯定不止如上介绍的,还需要更多高人去挖掘了。

    递归查询例子:

    例子:

    select s.id,s.PID,s.NAME,s.CATLEVEL from T_CATALOG s

    where s.catlevel=3 --对遍历结果进行过滤

    start with --start with 必须出现在where之后,但是可以是where and之间 入下例

    s.id=27701

    connect by prior

    s.id=s.pid

    关联商品

    SELECT * FROM (

    SELECT s.id,s.CATLEVEL from T_CATALOG s

    where s.catlevel=3 --对遍历结果进行过滤

    start with --start with 必须出现在where之后,但是可以是where and之间 入下例

    s.id=27701

    connect by prior

    s.id=s.pid) cat

    JOIN T_PRODUCT p ON p.CATALOGID=cat.ID

    如果直接join,需要用left join

    SELECT p.NAME,s.id,s.CATLEVEL from T_CATALOG s

    left JOIN T_PRODUCT p ON p.CATALOGID=s.ID

    where s.catlevel=3 AND p.NAME IS NOT null --对遍历结果进行过滤

    start with --start with 必须出现在where之后,但是可以是where and之间 入下例

    s.id=27701

    connect by prior

    s.id=s.pid

    外面join查数量:

    SELECT cat.id,cat.name,count(p.ID) count FROM (

    SELECT s.id,s.CATLEVEL from T_CATALOG s

    where s.catlevel=3 --对遍历结果进行过滤

    start with --start with 必须出现在where之后,但是可以是where and之间 入下例

    s.id=27701

    connect by prior

    s.id=s.pid) cat

    JOIN T_PRODUCT p ON p.CATALOGID=cat.ID

    GROUP by cat.id,cat.name

    查询父集合:

    --测试4:谈级联条件 --需求:根据地区名,查询上级地区 select s.areaname from s_coalarea_test s start with s.areaname='大同' connect by prior s.parentid=s.aid --注意,此时仅仅是级联条件顺序改变了 --总结:到底是查父节点还是子节点,有级联顺序决定 --规律:【本记录字段】=【连接字段】 --如本实例:是通过本记录的parentid匹配其他记录的aid(主键)结果是查父节点 -- 如顺序颠倒,则是:有本记录的aid(主键)匹配其他记录的parentid,结果是查子节点 select s.id,s.CATLEVEL from T_CATALOG s where s.catlevel=1 --对遍历结果进行过滤 start with --start with 必须出现在where之后,但是可以是where and之间 入下例 s.id=27703 connect by prior s.pid=s.id

    总结

    以上是编程之家为你收集整理的oracle递归用法全部内容,希望文章能够帮你解决oracle递归用法所遇到的程序开发问题。

    如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

    展开全文
  • Oracle递归函数

    2021-05-01 02:44:33
    Oracle递归函数CREATE OR REPLACE VIEW ADMIN.TYPETREEVIEW(ID, ITEMNO, ITEMNOSUB, GROUPID, MEMO,TREE)AS/* 2007/01/23 16:51 XieShaoHua 递归查询 */SELECT typetree.ID, typetree.itemno, typetree.itemnosub, ...

    Oracle递归函数

    CREATE OR REPLACE VIEW ADMIN.TYPETREEVIEW

    (ID, ITEMNO, ITEMNOSUB, GROUPID, MEMO,

    TREE)

    AS

    /* 2007/01/23 16:51 XieShaoHua 递归查询 */

    SELECT     typetree.ID, typetree.itemno, typetree.itemnosub, typetree.groupid,

    typetree.memo,

    RPAD (' ', LEVEL * 3 - 2, ' ') || '├' || typetree.memo AS tree

    from typetree

    START WITH itemnosub = '0'

    CONNECT BY PRIOR typetree.itemno = typetree.itemnosub;

    相关文档:

    1、创建表t1 :create table t1 (id number,name nvarchar(8));

    2、创建序列 :CREATE SEQUENCE t1_id INCREMENT BY 1 START WITH 1 MAXVALUE

    1.0E28 MINVALUE 1 NOCYCLE CACHE 20 NOORDER

    3. 创建触发器 :

    CREATE TRIGGER tig_insert_t1

    BEFORE INSERT ON "YINZQ"."T1"

    begin

    if (:new.id is null) then ......

    我们的Oracle管理工作中经常涉及到更改Oracle用户属性、密码之类的常用操作;但在某些应用场景下,会遇到Oracle用户名更改的需求,如何解决?下面通过四个步骤实现Oracle用户名的修改。

    一、查询更改Oracle用户名

    SQL> select user#,name,password from user$ where name ='TICKET ......

    Sql中两个“-”表示注释的开始。

    拼接运算符:”||”,注意:只有在所有的运算符为null时,拼接的结果是null。

    比较运算符用于比较两个值或表达式,给出一个布尔型的结果 true,false,null.

    比较运算符:

    =

    !=  <>   ^=

    [not]in 包含

    Any some 将一个值与列表中的每个值或者 ......

    select myFunc(参数1,参数2..) to dual; --可以执行一些业务逻辑

    一:Oracle中的函数与存储过程的区别:

    A:函数必须有返回值,而过程没有.

    B:函数可以单独执行.而过程必须通过execute执行.

    C:函数可以嵌入到SQL语句中执行.而过程不行.

    其实我们可以将比较复杂的查询写成函数.然后到存储过程中去调用这些函数.

    二:� ......

    1. ASCII

    返回与指定的字符对应的十进制数;

    SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dual;

    A A ZERO SPACE

    --------- --------- --------- ---------

    65 97 48 32

    2. CHR

    给出整数,返回对应的字符;

    SQL> select chr(54740) zhao,chr(65) chr65 from dual;

    ZH ......

    展开全文
  • Oracle 递归

    2018-05-21 12:13:08
    结果为:查询该节点的父级节点以及一直递归到根节点。 2.SELECT * FROM EMP START WITH EMPNO = 7566 CONNECT BY PRIOR EMPNO = MGR 解析:当前这条记录的EMPNO的值是下条数据MGR的值。也就是说我查询的是子节点。 ...

    SELECT * FROM EMP 

    scott用户下的员工表(EMP)。其中EMPNO为该员工的编号,而MGR为上级领导。所以该表为树形表。

    START WITH 条件1 CONNECT BY PRIOR 条件2 。条件1为开始的条件,条件2为连接条件(查询下条记录的条件)。

    1.SELECT * FROM EMP START WITH EMPNO = 7369 CONNECT BY  PRIOR MGR = EMPNO

    解析:当前这条记录的MGR的值是下条数据EMPNO的值。也就是说我查询的是父节点。


    结果为:查询该节点的父级节点以及一直递归到根节点。

    2.SELECT * FROM EMP START WITH EMPNO = 7566 CONNECT BY  PRIOR EMPNO = MGR

    解析:当前这条记录的EMPNO的值是下条数据MGR的值。也就是说我查询的是子节点。


    结果为:查询该节点的子节点以及一直递归到叶子节点。

    3.LEVEL 使用。(递归的深度)

    SELECT t.*,LEVEL  lv FROM EMP t START WITH EMPNO = 7566 CONNECT BY  PRIOR EMPNO = MGR


    4.SYS_CONNECT_BY_PATH使用。(根据深度把需要的数据进行拼接)

    SELECT t.*,LEVEL lv ,SYS_CONNECT_BY_PATH(ENAME,'>') 全称 FROM EMP t START WITH EMPNO = 7566 CONNECT BY  PRIOR EMPNO = MGR

    5.查询树(从根节点查询到子节点)

    select t.*,SYS_CONNECT_BY_PATH(ename,'>') || '>' as tree,LEVEL LV  from emp t start with empno in (select empno from emp where mgr is null) CONNECT BY  mgr = PRIOR empno


    SYS_CONNECT_BY_PATH(ename,'>') || '>' 可以在结尾的位置上再加上一个'>'。这是方便我们使用instr函数。

    展开全文
  • oracle递归、迭代

    2012-06-26 09:45:51
    Oracle使用递归查询。查询树结构的sql。在Oracle中,递归查询要用到start with ……connect by prior……
  • Oracle递归查询

    2021-05-01 00:40:34
    下面我以最典型的树形结构来说明下如何在Oracle使用递归查询。为了说明方便,创建一张数据库表,用于存储一个简单的树形结构Sql代码createtableTEST_TREE(IDNUMBER,PIDNUMBER,INDNUMBER,NAMEVARCHAR2(32))create...

    有的情况下,我们需要用递归的方法整理数据,这才程序中很容易做到,但是在数据库中,用SQL语句怎么实现?下面我以最典型的树形结构来说明下如何在Oracle使用递归查询。

    为了说明方便,创建一张数据库表,用于存储一个简单的树形结构

    Sql代码

    create table TEST_TREE

    (

    ID   NUMBER,

    PID  NUMBER,

    IND  NUMBER,

    NAME VARCHAR2(32)

    )

    create table TEST_TREE

    (

    ID NUMBER,

    PID NUMBER,

    IND NUMBER,

    NAME VARCHAR2(32)

    )

    ID是主键,PID是父节点ID,IND是排序字段,NAME是节点名称。初始化几条测试数据。

    IDPIDINDNAME

    1

    0

    1

    根节点

    2

    1

    1

    一级菜单1

    3

    1

    2

    一级菜单2

    4

    1

    2

    一级菜单3

    5

    2

    1

    一级1子1

    6

    2

    2

    一级1子2

    7

    4

    1

    一级3子1

    8

    4

    2

    一级3子2

    9

    4

    3

    一级3子3

    10

    4

    0

    一级3子0

    一、基本使用:

    在Oracle中,递归查询要用到start   with 。。。。connect   by   prior。。。

    具体格式是:

    Sql代码

    SELECT column

    from table_name

    START WITH column=value

    CONNECT BY PRIOR 父主键=子外键

    SELECT column

    from table_name

    START WITH column=value

    CONNECT BY PRIOR 父主键=子外键

    对于本例来说,就是:

    Sql代码

    select   d.*   from  test_tree d

    start   with   d.pid=0

    connect   by   prior   d.id=d.pid

    select d.* from test_tree d

    start with d.pid=0

    connect by prior d.id=d.pid

    查询结果如下:

    IDPIDINDNAME

    1

    0

    1

    根节点

    2

    1

    1

    一级菜单1

    5

    2

    1

    一级1子1

    6

    2

    2

    一级1子2

    3

    1

    2

    一级菜单2

    4

    1

    2

    一级菜单3

    7

    4

    1

    一级3子1

    8

    4

    2

    展开全文
  • Oracle 递归查询

    2021-04-30 08:10:29
    既然会看Oracle递归查询那么大家应该是比较清楚递归是什么意思了,在这里我就不多加说明了,只作简单介绍了。言归正传所谓递归查询那么数据表中数据的结构应该是符合递归查询的基本条件,即表中有ID,PID(节点编号、...
  • Oracle 递归函数介绍

    2012-05-09 11:06:03
    Oracle 递归函数介绍
  • oracle 递归 求和

    2021-05-05 01:48:06
    create table test( NAME varchar2(20), P_NAME varchar2(20), NUM int);insert into test values('1','-1',3 );insert into test values('11','1',5 );insert into test values('111','11',6 );...
  • oracle递归查询记录

    2021-05-04 04:23:11
    1.start with 开始的id connect by prior 开始的id=父id2. level 级别3.实例select * from (select a.*,level tt from biz_district a start with district_id=8 connect by prior district_id=parent_id) where tt=...
  • 总结:Oracle 递归查询

    2020-08-27 11:31:53
    我们公司用的 Oracle ,众所周知,Oracle 自带有递归查询的功能,所以实现起来特别简单。 但是,我记得 MySQL 是没有递归查询功能的,那 MySQL 中应该怎么实现呢? 于是,就有了这篇文章。 文章主要知识点: ...
  • oracle递归查询函数

    2021-05-01 02:44:22
    oracle递归查询函数(2013-01-14 14:57:23)标签:杂谈select a.client_department_id,a.parent_id,level "层次",sys_connect_by_path(client_department_id, '->')"合并层次",prior a.client_department_id "父...
  • oracle递归查询子节点

    2021-05-01 01:05:39
    通过子节点向根节点追朔....部门名称 oracle递归查询子节点 标签:blog art rom title ber 缺省 first www rac 本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:...
  • oracle的start with connect by prior是根据条件递归查询"树",分为四种使用情况:第一种:start with 子节点ID='...' connect by prior 子节点ID = 父节点ID1select * from mdm_organization o start with o.org_...
  • Oracle 递归查询的用法

    2021-05-07 05:27:56
    Oracle数据库中常要处理一些父子关系的记录,在OLTP中要用得多一些,oracle提供了递归查询可以很容易的满足这个需求,oracle递归查询通过start with [condition] connect by prior [condition]实现。我们先来看看...
  • Oracle递归查询的使用

    2020-12-10 17:13:36
    Oracle递归查询语法 select <column> from <table> start with 条件1 connect by prior 条件2 where 条件3; 条件1是根结点的限定语句,在自顶向下查询树结构时,不但可以从根节点开始,还可以定义任何...
  • oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的。这篇文章给大家介绍了Oracle递归树形结构查询功能,需要的朋友参考下
  • SQL> select * from (2 SELECT CONNECT_BY_ROOT(TOPUID) 上级用户,3 USERID 下级用户,4 LEVEL 层次,5 CASE6 WHEN (SELECT X.LEFTUID FROM TEST_DATE X WHERE X.USERID = 'lixiang') =7 ...
  • 递归层级查询:start with connect by prior以部门表作为解析表结构:dept{id:'主键',name:'部门名称',parent_id:'父亲id'}select * from deptstart with id=1 connect by prior id= parent_idorder siblings by id分...
  • 深入sql oracle递归查询

    2021-05-07 00:49:54
    表的所有列名 select name from sysobjects where xtype='u'select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='表名')查询数据sql语句里的递归查询 sqlServer2005和...
  • Q4:Oracle通过递归查询父子兄弟节点方法示例前言说到Oracle中的递归查询语法,我觉得有一些数据库基础的童鞋应该都知道,做项目的时候应该也会用到,下面本文就来介绍下关于Oracle通过递归查询父子兄弟节点的,分享...
  • 小白开发,今天在开发过程中遇到这样一个问题,对业务表进行查询,但需要到配置表中查询到匹配的数据,由于配置表需要进行递归。所以这样写了查询语句: select * from persion a where exists (select 1 from pe_zhi...
  • oracle递归查询

    2020-12-28 21:21:04
    而connect by是指定递归时记录与记录间的关系; 最重要的区分是prior:从上向下查,1作为parent,故将prior放在parent字段的另外一边,即表示查询所有的子条目 效果图: 2、查询某个指定id的所有下级菜单及该指定id...
  • 1.遇到问题(递归查询子节点时有两个pid如何更改) 2.附上oracle代码:(想在mysql做替换) select * from dataclean_...6.将oracle 递归sql 改为mysql start with CONNECT BY PR OR t.id (t.src_id,t.tag_id)可行方案
  • Oracle递归更新

    千次阅读 2019-05-28 17:19:59
    Oracle递归更新1、先递归查询2、批量更新 1、先递归查询 递归查询出主键字段 2、批量更新 根据主键字段更新即可 注意:in后括号中的参数个数有限制,Oracle 9i 中个数不能超过256,Oracle 10g个数不能超过1000...
  • 主要给大家介绍了关于Oracle如何通过递归查询父子兄弟节点的相关资料,递归查询对各位程序员来说应该都不陌生,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
  • 这是一个相当晚,但我不确定这可以使用递归CTE完成.然而,我确实使用MODEL子句提出了一个解决方案:WITH SAMPLE (ID,GRP_ID,SCORE,RANK) AS (SELECT 1,1,100,NULL FROM DUAL UNIONSELECT 2,1,90,NULL FROM DUAL UNION...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,494
精华内容 13,397
关键字:

oracle递归

友情链接: eavmw.zip