oracle-recursion Dear 丶 2023-10-18 16:02 82阅读 0赞 #### oracle-recursion #### -- 创建一个BBS的表 CREATE TABLE BBS ( PARENT_ID NUMBER(9, 0) NOT NULL, ID NUMBER(9, 0) NOT NULL, NAME VARCHAR2(200) NOT NULL -- 板块、文章、评论等。 ); -- 插入数据 -- 这个表是个树状结构的表 /* 论坛首页 --数据库开发 ----DB2 ------DB2 文章1 --------DB2 文章1 的评论1 --------DB2 文章1 的评论2 ------DB2 文章2 ----Oracle --Java 技术 */ INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (0,0,'论坛首页'); INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (0,1,'数据库开发'); INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (1,11,'DB2'); INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (11,111,'DB2 文章1'); INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (111,1111,'DB2 文章1 的评论1'); INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (111,1112,'DB2 文章1 的评论2'); INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (11,112,'DB2 文章2'); INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (1,12,'Oracle'); INSERT INTO BBS (PARENT_ID,ID,NAME) VALUES (0,2,'Java 技术'); -- 递归查询在查询树状结构的表时,十分有用,切记切记切记 SELECT -- LEVEL 是一个伪列,表示当前行所属层次,从 1 开始 LEVEL, -- CONNECT_BY_ISLEAF 表示当前行是否是叶子节点。1 表示叶子节点,0 表示非叶子节点。 CONNECT_BY_ISLEAF, -- CONNECT_BY_ROOT 是一个操作符,用来修饰列,表示该列的值是根节点的值。 CONNECT_BY_ROOT NAME, -- SYS_CONNECT_BY_PATH 是一个函数,返回层次路径 SYS_CONNECT_BY_PATH(NAME, '/') FROM BBS -- START WITH 用来表示起始行 START WITH NAME = 'DB2' -- CONNECT BY 用来指定父子连接条件 -- PRIOR 是一个操作符,用来修饰列,表示该列是父行中的列 CONNECT BY PRIOR ID = PARENT_ID -- ORDER SIBLINGS BY 对同一层次中的行进行排序 ORDER SIBLINGS BY NAME -- 查看所有BBS数据 SELECT * FROM bbs; -- 11 112 -- 修改数据,也就是修改db2 文章2的id和文章1一样,但是父级id不同 -- 也就是说一个id拥有两个父级 update bbs set parent_id=1112,id=111 where name = 'DB2 文章2'; -- 检查错误 SELECT -- CONNECT_BY_ISCYCLE 是一个伪列,1 表示存在循环引用,否则为 0 CONNECT_BY_ISCYCLE, NAME FROM BBS -- NOCYCLE 指示 Oracle 出错不要停 CONNECT BY NOCYCLE PRIOR ID = PARENT_ID; -- 将数据修改回正常状态 UPDATE bbs SET parent_id = 11, id = 112 WHERE name = 'DB2 文章2'; -- 也可以使用这个递归,精妙的无以伦比 WITH TEMP(PARENT_ID,ID,NAME) AS ( SELECT PARENT_ID,ID,NAME FROM BBS WHERE NAME='DB2'---语句1 UNION ALL---语句2 SELECT B.PARENT_ID,B.ID,B.NAME FROM BBS B, TEMP T WHERE B.PARENT_ID=T.ID---语句3 ) SELECT NAME FROM TEMP;---语句4 -- 你想生成从 1 到 100 的数字 SELECT ROWNUM FROM DUAL CONNECT BY ROWNUM <= 100;
还没有评论,来说两句吧...