问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

oracle 中怎样递归查询出子节点的最上层父节点,并且其父节点是自身

发布网友 发布时间:2022-04-08 07:44

我来回答

6个回答

懂视网 时间:2022-04-08 12:06

CREATE TABLE SC_DISTRICT
(
 ID  NUMBER(10)   NOT NULL,
 PARENT_ID NUMBER(10),
 NAME VARCHAR2(255 BYTE)  NOT NULL
);

ALTER TABLE SC_DISTRICT ADD (
 CONSTRAINT SC_DISTRICT_PK
 PRIMARY KEY
 (ID));

ALTER TABLE SC_DISTRICT ADD (
 CONSTRAINT SC_DISTRICT_R01 
 FOREIGN KEY (PARENT_ID) 
 REFERENCES SC_DISTRICT (ID));
技术分享

 插入数据:

技术分享
INSERT INTO SC_DISTRICT(ID,NAME) VALUES(1,‘四川省‘);

INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(2,1,‘巴中市‘);
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(3,1,‘达州市‘); 

INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(4,2,‘巴州区‘);
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(5,2,‘通江县‘);
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(6,2,‘平昌县‘);

INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(7,3,‘通川区‘);
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(8,3,‘宣汉县‘);

INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(9,8,‘塔河乡‘);
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(10,8,‘三河乡‘);
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(11,8,‘胡家镇‘);
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(12,8,‘南坝镇‘);
 
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(13,6,‘大寨乡‘);
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(14,6,‘响滩镇‘);
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(15,6,‘龙岗镇‘);
INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(16,6,‘白衣镇‘);
技术分享

生成表如下:

技术分享

  • 查询某节点的所有子孙节点
  • 技术分享
    查询巴中市下面的所有行政组织(结果包含当前节点):
    SELECT *
    FROM SC_DISTRICT
    START WITH NAME=‘巴中市‘
    CONNECT BY PRIOR ID=PARENT_ID
    
    查询结果:
    ID PARENT_ID NAME
    2 1  巴中市
    4 2  巴州区
    5 2  通江县
    6 2  平昌县
    13 6  大寨乡
    14 6  响滩镇
    15 6  龙岗镇
    16 6  白衣镇
    技术分享
  • 查询指定节点的递归根节点
  • 技术分享
    查询响滩镇镇所属的市:
    SELECT ID, PARENT_ID, NAME, 
     CONNECT_BY_ROOT(ID) CITY_ID,
     CONNECT_BY_ROOT(NAME) CITY_NAME
    FROM SC_DISTRICT
    WHERE NAME=‘响滩镇‘ 
     START WITH PARENT_ID=1
     CONNECT BY PRIOR ID=PARENT_ID
    查询结果:
    ID PARENT_ID NAME CITY_ID CITY_NAME
    14 6  响滩镇 2  巴中市
    技术分享
  • CONNECT BY子句伪列的应用
  • 技术分享
    LEVEL:查询节点层次,从1开始。
    CONNECT_BY_ISLEAF:查询节点是否是叶子节点,是则为1,不是则为0
    SELECT ID, NAME, PARENT_ID, LEVEL, CONNECT_BY_ISLEAF
    FROM SC_DISTRICT
      START WITH NAME=‘巴中市‘
      CONNECT BY PRIOR ID=PARENT_ID 
      ORDER BY ID;
    
    查询结果:
    ID NAME PARENT_ID LEVEL CONNECT_BY_ISLEAF
    2 巴中市 1 1 0
    4 巴州区 2 2 1
    5 通江县 2 2 1
    6 平昌县 2 2 0
    13 大寨乡 6 3 1
    14 响滩镇 6 3 1
    15 龙岗镇 6 3 1
    16 白衣镇 6 3 1
    技术分享
  • 查询递归路径
  • 技术分享
    查询巴中市下行政组织递归路径
    SELECT ID, NAME, PARENT_ID,
     SUBSTR(SYS_CONNECT_BY_PATH(NAME,‘->‘),3) NAME_PATH
    FROM SC_DISTRICT
     START WITH NAME=‘巴中市‘
     CONNECT BY PRIOR ID=PARENT_ID
     
    查询结果:
    ID NAME PARENT_ID NAME_PATH
    2 巴中市 1 巴中市
    4 巴州区 2 巴中市->巴州区
    5 通江县 2 巴中市->通江县
    6 平昌县 2 巴中市->平昌县
    13 大寨乡 6 巴中市->平昌县->大寨乡
    14 响滩镇 6 巴中市->平昌县->响滩镇
    15 龙岗镇 6 巴中市->平昌县->龙岗镇
    16 白衣镇 6 巴中市->平昌县->白衣镇
    技术分享

    Oracle递归查询

    标签:

    热心网友 时间:2022-04-08 09:14

    1、创建测试表,create table test_connect(id number, p_id number);

    2、插入测试数据,

    insert into test_connect values(1,1);

    insert into test_connect values(2,1);

    insert into test_connect values(3,2);

    insert into test_connect values(4,3);

    commit;

    3、查询数据表内容,select * from test_connect ,

    4、执行递归查询语句,加入nocycle要素,不会出现【ORA-01436: 用户数据中的 CONNECT BY 循环的错误】,执行结果如下,

    select *

      from test_connect t

     start with id = 4

    connect by nocycle prior t.p_id = t.id

    热心网友 时间:2022-04-08 10:32

    可以指定根节点,到根节点处停止递归

    select sd.id,
           sd.parent_id,
           sd.name,
           connect_by_root(sd.id) city_id, -- 递归查询到根节点的ID
           connect_by_root(sd.name)city_name -- 递归查询到根节点的name
     from sc_district sd
    where sd.name = '响滩镇' -- 定位到树的叶子节点
    start with parent_id = 1 -- 从下到上遍历到根节点,只到parent_id =1 才结束遍历(可以想象成遍历到树根,第一级别节点)
    connect by prior id= sd.parent_id -- 自下而上,下一行的id等于这一行的parent_id

    热心网友 时间:2022-04-08 12:06

    select id from ( select id ,PARENTLOGID from 表一 connect by nocycle prior PARENTLOGID=id START WITH id='3' ) where PARENTLOGID is null

    热心网友 时间:2022-04-08 13:58

    treeview.selectednode.parentnode貌似有这个属性,你找找parent

    热心网友 时间:2022-04-08 16:06

    楼主您好
    可以试试connect by prior替换成connect by nocycle prior
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    挖掘机上的字母标志是什么牌子的挖机 中国市场上挖掘机那国技术占优 微信个人标签经典短句最精辟的微信个性签名 肚子总是不消化,吃完东西不想上厕所。涨涨的 最近老是肚子疼,但疼一会儿就不疼了,就是不想上厕所,有时候五六天都没... ...但是不疼几乎每天早上都会不舒服,也不想上厕所,就是弄的你睡不着觉... 我的肚子老疼,但不是很想上厕所,最近有点拉肚子,可是一吃凉的东西肚子... 因为节目结缘却最终分开,姚沐希彭措的分手,暗示了娱乐圈什么问题? x79支持什么显卡 四叶草是不是三叶草? 求酒店员工转正的自我评价。仓管员。 想应聘仓管职位,简历中的自我评价怎么写? 3DS模拟器怎么导入游戏 citra 3ds模拟器怎么加载游戏 急求,请教大家:仓管员试用期转正考核的自我评价 怎么写的啊? 电脑可以用3DS模拟器那? 仓库管理员的自我评价怎么写 citra 3ds模拟器怎么改中文 自我评价怎么说刚步入在仓管的经历呢? 找一本女主角是狐妖爱上道士的小说 3ds之中的模拟器要怎么使用 求一本现代狐妖小说,讲的是主角被他女朋友甩了,然后一个狐妖附体, 3ds游戏怎么安装 我把sd卡 放到了手机上下游戏 找工作(仓管工作)自我评价怎么写?? 狐妖和道士的温馨 短文 想找一本之前看过的一本书,好像是叫妖魔来了,还是什么来了之什么的 3DS上怎么安装GBA模拟器 仓管自我评价怎么写 3ds模拟器怎么使用 师傅我才16岁,我不想下山我养不起你去找你三个师姐? 仓管员的自我评价三个缺点 我是男生,头发很油,有没有比较好的去油洗发水? 一天不洗头就很油真无奈,都叫我油头男有没有去油好的洗发水求推荐 男生头发太油,需要用什么洗发水啊?(强力推荐下哦) 男士头发油多,头皮屑多用什么洗发水好 哪种洗发水能控油?而且适合男学生用的? 男士用什么品牌的洗发水控油比较好? 推荐几款男士用控油去油效果好的洗发水洗面奶 梦见上门牙掉了一颗又长出了一颗小上门牙 解梦高手帮忙!!!自己门牙掉了又长新牙齿! 梦见上面的门牙掉了一颗和边上的几只小牙不疼什么意思 梦见 大牙掉了一颗 下门牙旁的一颗小牙也掉了 但是小牙掉后长了颗小牙 求高人指教 中国人的自信源于哪? 中国人的自信源自哪里? 中国的自信体现在哪些方面 什么是中国自信民族自信的根本所在 中国男篮和NBA夏季联赛达成长期合作,大家的看法有什么呢? 中国男篮夏季联赛1胜4负收官,这几场赛事对男篮最大收获是什么? 国人的自信是从哪些方面来的? 中国男篮夏季联赛1胜4负收官,这几场比赛谁的表现令人印象最深? 为什么中国男篮也可以参加nba夏季联赛赛程