zoukankan      html  css  js  c++  java
  • oracle connect by用法篇 (包括树遍历)之一

    1、基本语法

    select * from table [start with condition1]
        connect by [prior] id=parentid

    一般用来查找存在父子关系的数据,也就是树形结构的数据;其返还的数据也能够明确的区分出每一层的数据。

    start with condition1 是用来限制第一层的数据,或者叫根节点数据;以这部分数据为基础来查找第二层数据,然后以第二层数据查找第三层数据以此类推。

    connect by [prior] id=parentid 这部分是用来指明Oracle在查找数据时以怎样的一种关系去查找;比如说查找第二层的数据时用第一层数据的id去跟表里面记录的parentid字段进行匹配,如果这个条件成立那么查找出来的数据就是第二层数据,同理查找第三层第四层…等等都是按这样去匹配。

     prior还有一种用法:

    select * from table [start with condition1]
        connect by id= [prior] parentid

    或者

    select * from table [start with condition1]
        connect by [prior] parentid = id

    这种用法就表示从下往上查找数据,可以理解为从叶子节点往上查找父级几点,用第一层数据的parentid去跟表记录里面的id进行匹配,匹配成功那么查找出来的就是第二层数据;上面的那种就是从父级节点往下查找叶子节点。

    其他特性

    level关键字,代表树形结构中的层级编号;第一层是数字1,第二层数字2,依次递增。

    CONNECT_BY_ROOT方法,能够获取第一层集结点结果集中的任意字段的值;例CONNECT_BY_ROOT(字段名)。

    2、下面来贴两个例子

    2.1从根节点查找叶子节点

    select t.*, level, CONNECT_BY_ROOT(id)
      from tab_test t
     start with t.id = 0
    connect by prior t.id = t.fid;

    2.2从叶子节点查找上层节点

    --第一种,修改prior关键字位置
    select t.*, level, CONNECT_BY_ROOT(id)
      from tab_test t
     start with t.id = 4
    connect by t.id = prior t.fid;
    
    --第二种,prior关键字不动 调换后面的id=fid逻辑关系的顺序
    select t.*, level, CONNECT_BY_ROOT(id)
      from tab_test t
     start with t.id = 4
    connect by prior t.fid = t.id;

    3、写几个平常用到的其他一些用法

    3.1生成数字序列结果集

    使用rownum实现1到10的序列:

    select rownum from dual connect by rownum<=10;

     

    使用level实现1到10的序列:

    select level from dual connect by level<=10;

  • 相关阅读:
    CCF NOI1067 最匹配的矩阵
    POJ NOI0105-29 数字反转
    POJ NOI0105-30 含k个3的数
    POJ NOI0105-32 求分数序列和
    POJ NOI0105-33 计算分数加减表达式的值
    POJ NOI0105-34 求阶乘的和
    POJ NOI0105-35 求出e的值
    POJ NOI0105-36 计算多项式的值
    POJ NOI0105-44 第n小的质数
    POJ NOI0105-43 质因数分解
  • 原文地址:https://www.cnblogs.com/cainiao-Shun666/p/6963259.html
Copyright © 2011-2022 走看看