关于orcale的层级查询

伯恩dadi 2015-04-07 09:51:11
各位大神,问一个问题,关于orcale的层级查询的,我想新建一个字段,用来代表父子关系,例如 0001 代表父节点,那00010001和00010002代表子节点,以此类推,这种怎么通过已有的父子关系生成,求解答,谢谢。

例如
id parent_id catId
1 -1 0001
2 1 00010001
3 1 00010002
4 3 000100020001
5 3 000100020002
求解catid怎么生成
注:根节点0001为初始化的数据
...全文
194 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyangsoft 2015-04-07
  • 打赏
  • 举报
回复

第一步只是生成所有数据的后四位
lyangsoft 2015-04-07
  • 打赏
  • 举报
回复
汗 ,你要把所有的都看完呀!这只是第一步处理 处理过后就是 1 -1 0001 2 1 0001 3 1 0002 4 3 0003 5 3 0001 第二步 1 -1 0001 2 1 00010001 3 1 00010002 4 3 0003 5 3 0001 第三步 1 -1 0001 2 1 00010001 3 1 00010002 4 3 000100020003 5 3 000100020001 第四步。。。。
伯恩dadi 2015-04-07
  • 打赏
  • 举报
回复
问题同上
伯恩dadi 2015-04-07
  • 打赏
  • 举报
回复
谢谢大神,但是有点不对 【SELECT AA.ID, AA.PARENT_ID, ROW_NUMBER() OVER(PARTITION BY AA.PARENT_ID ORDER BY ID) ROW_NUM FROM TABLE_NAME AA】 这样写,相同层级的row_num 就一样了,没有办法区分每一条
lyangsoft 2015-04-07
  • 打赏
  • 举报
回复
--第一步分组后加前缀标号
UPDATE TABLE_NAME TT
   SET CATID =
       (SELECT CASE
                 WHEN ROW_NUM < 10 THEN
                  '000'
                 WHEN ROW_NUM < 100 THEN
                  '00'
                 WHEN ROW_NUM < 1000 THEN
                  '0'
                 ELSE
                  ''
               END || BB.ROW_NUM
          FROM (SELECT AA.ID,
                       AA.PARENT_ID,
                       ROW_NUMBER() OVER(PARTITION BY AA.PARENT_ID ORDER BY ID) ROW_NUM
                  FROM TABLE_NAME AA) BB
         WHERE BB.ID = TT.ID);
--第二步 因为parent_id为-1的不需要改变 则改变下一级的 CATID
UPDATE TABLE_NAME TT
   SET CATID =
       (SELECT AA.CATID FROM TABLE_NAME AA WHERE AA.ID = TT.PARENT_ID) || --找到父节点的CATID 并合并
       TT.CATID
 WHERE TT.PARENT_ID IN (SELECT ID FROM TABLE_NAME WHERE PARENT_ID = -1) --父节点为第一级的id
;
--第三步 更改第三级
UPDATE TABLE_NAME TT
   SET CATID =
       (SELECT AA.CATID FROM TABLE_NAME AA WHERE AA.ID = TT.PARENT_ID) || --找到父节点的CATID 并合并
       TT.CATID
 WHERE TT.PARENT_ID IN
       (SELECT ID
          FROM TABLE_NAME BB
         WHERE BB.PARENT_ID IN
               (SELECT ID FROM TABLE_NAME WHERE PARENT_ID = -1)) --父节点为第二级的id
;
--以此类推 有多少级就执行多少次
小灰狼W 2015-04-07
  • 打赏
  • 举报
回复
伯恩dadi 2015-04-07
  • 打赏
  • 举报
回复
引用 8 楼 u012355452 的回复:
[quote=引用 7 楼 wildwave 的回复:] 改一下,不用加字段了。直接更新 UPDATE 表名 T SET T.CATID = (WITH TMP AS (SELECT ID, REPLACE(SYS_CONNECT_BY_PATH(TO_CHAR(RK, 'fm0000'), ','), ',') CAT FROM (SELECT ID, PARENT_ID, ROW_NUMBER() OVER(PARTITION BY PARENT_ID ORDER BY ID) RK FROM 表名) START WITH PARENT_ID = -1 CONNECT BY PRIOR ID = PARENT_ID) SELECT CAT FROM TMP X WHERE X.ID = T.ID);
版主 你为何这么吊,学到了,我的虽然能达到目的,但太复杂了[/quote] 非常感谢,谢谢
伯恩dadi 2015-04-07
  • 打赏
  • 举报
回复
引用 7 楼 wildwave 的回复:
改一下,不用加字段了。直接更新 UPDATE 表名 T SET T.CATID = (WITH TMP AS (SELECT ID, REPLACE(SYS_CONNECT_BY_PATH(TO_CHAR(RK, 'fm0000'), ','), ',') CAT FROM (SELECT ID, PARENT_ID, ROW_NUMBER() OVER(PARTITION BY PARENT_ID ORDER BY ID) RK FROM 表名) START WITH PARENT_ID = -1 CONNECT BY PRIOR ID = PARENT_ID) SELECT CAT FROM TMP X WHERE X.ID = T.ID);
感谢大神帮助~~~3q
lyangsoft 2015-04-07
  • 打赏
  • 举报
回复
引用 7 楼 wildwave 的回复:
改一下,不用加字段了。直接更新 UPDATE 表名 T SET T.CATID = (WITH TMP AS (SELECT ID, REPLACE(SYS_CONNECT_BY_PATH(TO_CHAR(RK, 'fm0000'), ','), ',') CAT FROM (SELECT ID, PARENT_ID, ROW_NUMBER() OVER(PARTITION BY PARENT_ID ORDER BY ID) RK FROM 表名) START WITH PARENT_ID = -1 CONNECT BY PRIOR ID = PARENT_ID) SELECT CAT FROM TMP X WHERE X.ID = T.ID);
版主 你为何这么吊,学到了,我的虽然能达到目的,但太复杂了
小灰狼W 2015-04-07
  • 打赏
  • 举报
回复
改一下,不用加字段了。直接更新 UPDATE 表名 T SET T.CATID = (WITH TMP AS (SELECT ID, REPLACE(SYS_CONNECT_BY_PATH(TO_CHAR(RK, 'fm0000'), ','), ',') CAT FROM (SELECT ID, PARENT_ID, ROW_NUMBER() OVER(PARTITION BY PARENT_ID ORDER BY ID) RK FROM 表名) START WITH PARENT_ID = -1 CONNECT BY PRIOR ID = PARENT_ID) SELECT CAT FROM TMP X WHERE X.ID = T.ID);
小灰狼W 2015-04-07
  • 打赏
  • 举报
回复
增加一个字段用来储存临时排序 ALTER TABLE 表名 ADD rk INTEGER; UPDATE 表名 t SET rk=(SELECT COUNT(1) FROM 表名 x WHERE x.parent_id=t.parent_id AND x.id<=t.id); 更新catid字段: UPDATE 表名 T SET T.CATID = (WITH TMP AS (SELECT ID, REPLACE(SYS_CONNECT_BY_PATH(TO_CHAR(RK, 'fm0000'), ','), ',') CAT FROM 表名 START WITH PARENT_ID = -1 CONNECT BY PRIOR ID = PARENT_ID) SELECT CAT FROM TMP X WHERE X.ID = T.ID);

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧