上海智能网站建设设计,深圳建站模板建站,网站建设案例单招网,php可以做移动端网站实际生活有很多树形结构的数据#xff0c;比如公司分为多个部门、部门下分为多个组#xff0c;组下分为多个员工#xff1b;省市县的归属#xff1b;页面菜单栏等等。 如果想查询某个节点的父节点或者子节点#xff0c;一般通过表自身连接完成#xff0c;但如果该节点的子…实际生活有很多树形结构的数据比如公司分为多个部门、部门下分为多个组组下分为多个员工省市县的归属页面菜单栏等等。 如果想查询某个节点的父节点或者子节点一般通过表自身连接完成但如果该节点的子节点还有很多层结构就需要使用递归调用。但如果数据量特别大递归的次数指数级上升而且查询数据库的次数也指数级上升导致程序和数据库压力剧增查询时间特别长。 start with connect by prior 递归查询 1、数据准备
create table area_test(
id number(10) not null,
parent_id number(10),
name varchar2(255) not null
);
alter table area_test add (constraint district_pk primary key (id));
insert into area_test (ID, PARENT_ID, NAME) values (1, null, 中国);
insert into area_test (ID, PARENT_ID, NAME) values (11, 1, 河南省);
insert into area_test (ID, PARENT_ID, NAME) values (12, 1, 北京市);
insert into area_test (ID, PARENT_ID, NAME) values (111, 11, 郑州市);
insert into area_test (ID, PARENT_ID, NAME) values (112, 11, 平顶山市);
insert into area_test (ID, PARENT_ID, NAME) values (113, 11, 洛阳市);
insert into area_test (ID, PARENT_ID, NAME) values (114, 11, 新乡市);
insert into area_test (ID, PARENT_ID, NAME) values (115, 11, 南阳市);
insert into area_test (ID, PARENT_ID, NAME) values (121, 12, 朝阳区);
insert into area_test (ID, PARENT_ID, NAME) values (122, 12, 昌平区);
insert into area_test (ID, PARENT_ID, NAME) values (1111, 111, 二七区);
insert into area_test (ID, PARENT_ID, NAME) values (1112, 111, 中原区);
insert into area_test (ID, PARENT_ID, NAME) values (1113, 111, 新郑市);
insert into area_test (ID, PARENT_ID, NAME) values (1114, 111, 经开区);
insert into area_test (ID, PARENT_ID, NAME) values (1115, 111, 金水区);
insert into area_test (ID, PARENT_ID, NAME) values (1121, 112, 湛河区);
insert into area_test (ID, PARENT_ID, NAME) values (1122, 112, 舞钢市);
insert into area_test (ID, PARENT_ID, NAME) values (1123, 112, 宝丰市);
insert into area_test (ID, PARENT_ID, NAME) values (11221, 1122, 尚店镇);2、start with connect by prior 递归 查询 [ˈpraɪə®] 先前的
1start whit 子句遍历起始条件。如果要查父节点这里可以用子节点的列反之则反。 2connect by 子句连接条件。prior跟父节点列parent_id放在一起。就是往父节点方向遍历。prior跟子节点列sub_id放在一起则往叶子节点方向遍历。parent_id、id两列谁放在“”前都无所谓关键是prior跟谁在一起。 3order by 子句排序 常用的select项 level:级别 connect_by_root:根节点 sys_connect_by_path:递归路径
其实如果单层结构使用表自身连接也可以实现
2、查询所有父节点
3、查询指定节点的根节点
3、with递归查询 3.1 with递归子类 WITH TMP /*(id, parent_id, name) */ AS (SELECT ID, PARENT_ID, NAME FROM AREA_TEST WHERE NAME ‘平顶山市’) SELECT ID, PARENT_ID, NAME FROM AREA_TEST WHERE NAME ‘平顶山市’ UNION ALL SELECT D.ID, D.PARENT_ID, D.NAME FROM TMP, AREA_TEST D WHERE TMP.ID D.PARENT_ID
3.2 with递归父类