zoukankan      html  css  js  c++  java
  • Oracle递归查询

    一、创建数据

    1.1、建立表与插入数据

    复制代码
    CREATE TABLE DISTRICT
    (
      ID         NUMBER(10)                  NOT NULL,
      PARENT_ID  NUMBER(10),
      NAME       VARCHAR2(255 BYTE)          NOT NULL
    );
    
    ALTER TABLE DISTRICT ADD (
      CONSTRAINT DISTRICT_PK
     PRIMARY KEY
     (ID));
    
    ALTER TABLE DISTRICT ADD (
      CONSTRAINT DISTRICT_R01 
     FOREIGN KEY (PARENT_ID) 
     REFERENCES DISTRICT (ID));
     
     
     insert into DISTRICT (id, parent_id, name)
    values (1, null, '四川省');
    insert into DISTRICT (id, parent_id, name)
    values (2, 1, '巴中市');
    insert into DISTRICT (id, parent_id, name)
    values (3, 1, '达州市');
    insert into DISTRICT (id, parent_id, name)
    values (4, 2, '巴州区');
    insert into DISTRICT (id, parent_id, name)
    values (5, 2, '通江县');
    insert into DISTRICT (id, parent_id, name)
    values (6, 2, '平昌县');
    insert into DISTRICT (id, parent_id, name)
    values (7, 3, '通川区');
    insert into DISTRICT (id, parent_id, name)
    values (8, 3, '宣汉县');
    insert into DISTRICT (id, parent_id, name)
    values (9, 8, '塔河乡');
    insert into DISTRICT (id, parent_id, name)
    values (10, 8, '三河乡');
    insert into DISTRICT (id, parent_id, name)
    values (11, 8, '胡家镇');
    insert into DISTRICT (id, parent_id, name)
    values (12, 8, '南坝镇');
    insert into DISTRICT (id, parent_id, name)
    values (13, 6, '大寨乡');
    insert into DISTRICT (id, parent_id, name)
    values (14, 6, '响滩镇');
    insert into DISTRICT (id, parent_id, name)
    values (15, 6, '龙岗镇');
    insert into DISTRICT (id, parent_id, name)
    values (16, 6, '白衣镇');
    commit;
    复制代码

    二、start with connect by prior递归

    2.1、查询所有子节点

    SELECT *
    FROM district
    START WITH NAME ='巴中市'
    CONNECT BY PRIOR ID=parent_id

    2.2、查询所有父节点

    SELECT *
    FROM district
    START WITH NAME ='平昌县'
    CONNECT BY PRIOR parent_id=ID

    只需要交换 id 与parent_id的位置即可

    2.3、查询指定节点的,根节点

    复制代码
    SELECT d.*,
    connect_by_root(d.id),
    connect_by_root(NAME)
    FROM district d
    WHERE NAME='平昌县'
    START WITH d.parent_id=1    --d.parent_id is null 结果为四川省
    CONNECT BY PRIOR d.ID=d.parent_id
    复制代码

    2.4、查询巴中市下行政组织递归路径

    SELECT ID,parent_id,NAME,
    sys_connect_by_path(NAME,'->') namepath,
    LEVEL
    FROM district 
    START WITH NAME='巴中市'
    CONNECT BY PRIOR ID=parent_id

    三、with递归

    3.1、with递归子类

    复制代码
    WITH t (ID ,parent_id,NAME) --要有列名
    AS(
    SELECT ID ,parent_id,NAME FROM district WHERE NAME='巴中市'
    UNION ALL
    SELECT d.ID ,d.parent_id,d.NAME FROM t,district d --要指定表和列表,
    WHERE t.id=d.parent_id
    )
    SELECT * FROM t;
    复制代码

    3.2、递归父类

    复制代码
    WITH t (ID ,parent_id,NAME) --要有表
    AS(
    SELECT ID ,parent_id,NAME FROM district WHERE NAME='通江县'
    UNION ALL
    SELECT d.ID ,d.parent_id,d.NAME FROM t,district d --要指定表和列表,
    WHERE t.parent_id=d.id
    )
    SELECT * FROM t;
    复制代码

  • 相关阅读:
    笔记35 跨重定向请求传递数
    判断邮箱的正则表达式
    按钮
    async await 的用法
    笔记34 Spring MVC的高级技术——处理multipart形式的数据
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Unique Binary Search Trees,Unique Binary Search Trees II
    Validate Binary Search Tree
    Populating Next Right Pointers in Each Node,Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/Soprano/p/10659127.html
Copyright © 2011-2022 走看看