加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle层次查询start with connect by

发布时间:2020-12-12 13:19:51 所属栏目:百科 来源:网络整理
导读:博客参考: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

博客参考: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,PID) VALUES(2,222,1);
INSERT INTO TBL_TEST(ID,PID) VALUES(3,333,PID) VALUES(4,444,PID) VALUES(5,555,2);
INSERT INTO TBL_TEST(ID,PID) VALUES(6,666,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

记录如下:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读