zoukankan      html  css  js  c++  java
  • Oracle层次查询start with connect by

    博客参考:https://www.cnblogs.com/jerryxing/articles/2339352.html

    start with connect by 层次查询(Hierarchical Queries)

    语法:

    SELECT     *
          FROM table
    START WITH ID = 1
    CONNECT BY PRIOR PID = ID

    start with: 表示根记录的条件
    connect by: 指定了父记录行和子记录行之间的关系,在层次查询中,条件表达式必须使用prior操作符来指定父记录行
    如:
    CONNECT BY PRIOR pid = id 或者CONNECT BY pid = PRIOR id
    如果connect by 条件是一个组合条件,那么只有一个条件需要prior操作符,
    如:
    CONNECT BY last_name != 'King' AND PRIOR employee_id = manager_id

    不过,connect by 不能包含子查询。
    prior是一个二元操作符,最常见的是用于列值相等的比较,它让Oracle使用对应列的父亲行的值。使用非相等比较,极有可能倒致查询陷入无穷循环,以出错终止。

    Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。可以通过一个简单的例子来理解其使用的概念和方法。

    创建表示例:

    CREATE TABLE tbl_test
     (
      ID    NUMBER,
      NAME  VARCHAR2(10),
      pid   NUMBER DEFAULT 0
     );
     
     
    INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','111','0');
    INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','222','1');
    INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','333','0');
    INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','444','1');
    INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','555','2');
    INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('6','666','0');
    INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('9','999','2');

     查询表数据:

    从父记录行向子记录行递归

    select * from TBL_TEST start with id=1 connect by prior id=pid

     根节点为id=1

    connect by prior id=pid 由id和pid建立父子关系,id=1开始,在pid寻找等于1的值,可以找到2和4,在pid=2,4 中找,找到id有5和9俩个。

    从子记录向父记录递归

    select * from TBL_TEST start with id=5 connect by prior pid=id

    根节点为id=5

    connect by prior pid=id   id=5时,找pid为2,在找id=2的行,找到pid=1,再找id=1的行

    LEVEL,ROW_NUMBER,OVER的应用

    SELECT     LEVEL, 
               pid,
               ROW_NUMBER () OVER (PARTITION BY pid ORDER BY pid) by_pid,
               ROW_NUMBER () OVER (ORDER BY pid) AS rn, NAME
          FROM tbl_test
    START WITH pid = 0
    CONNECT BY PRIOR ID = pid
      ORDER BY 1

    记录如下:

  • 相关阅读:
    iOS开发 | 自定义不规则label
    监控redis的操作命令
    HTML常用标签
    前端学习【第一篇】: HTML内容
    MySQL数据库修改字段的长度
    python模块之:paramiko
    使用pymysql操作mysql数据库
    Python开发【第九篇】: 并发编程
    JNI调用实例
    JVM性能调优入门
  • 原文地址:https://www.cnblogs.com/hello-wei/p/10368838.html
Copyright © 2011-2022 走看看