oracle 层级查询

oracle 递归查询

  • 简介

start with … connect by prior 一般用于层级查询具有树形结构的表

  • 语法
select ...  from table_name 
    where condition
    start with condition
    connect by prior 

实际应用

-- 测试表&数据准备

create table hierarchical(
       region_id number not null,
       region_name varchar2(124),
       parent_region_id number,
       parent_region_name varchar2(124)
);
-- 备注
comment on table hierarchical is '创建区域表,以河南省部分地市,区县为例';
comment on column hierarchical.region_id is '区域id';
comment on column hierarchical.region_name is '区域名称';
comment on column hierarchical.parent_region_id is '上级区域id';
comment on column hierarchical.parent_region_name is '上级区域名称';

-- 添加主外键约束
alter table hierarchical
      add constraint hie_pk primary key (region_id);
alter table hierarchical 
      add constraint hie_hie_fk foreign key (parent_region_id) references hierarchical(region_id);
-- 新建索引
create index hie_parent_region_id_idx on hierarchical(parent_region_id);

-- 插入测试数据
insert into hierarchical values('1','河南省',null,null);

insert into hierarchical values('2','郑州','1','河南省');

insert into hierarchical values('3','郑州市','2','郑州');
insert into hierarchical values('4','新郑市','2','郑州');

insert into hierarchical values('5','金水区','3','郑州市');
insert into hierarchical values('6','二七区','3','郑州市');

insert into hierarchical values('7','新郑龙王','4','新郑市');
insert into hierarchical values('8','新郑八千','4','新郑市');
  • 自顶向下查询
select h.region_name , '属于' 属于 , h.parent_region_name from hierarchical h
       where level = 1 
       -- where 的位置必须要在层级查询子句的前面
       start with h.parent_region_id is null 
       -- 限制root位置
       connect by prior h.region_id = h.parent_region_id;
       -- 表示开始位置的region_id 要等于 下一条记录的 parent_reggion_id
       -- 也可以直接查询 level 关键字 ,从而确定记录在当前查询树种的位置
  • 自顶向下查询结果

    region_name属于parent_region_name
    河南省属于
    郑州属于河南省
    郑州市属于郑州
    金水区属于郑州市
    二七区属于郑州市
    新郑市属于郑州
    新郑龙王属于新郑市
    新郑八千属于新郑市
  • 自底向上查询

select *
       from hierarchical hi 
       start with hi.region_id = (select max(hc.region_id)  from hierarchical hc )
       connect by prior hi.parent_region_id = hi.region_id;
  • 自底向上查询结果
region_idregion_nameparent_region_idparent_region_name
8新郑八千4新郑市
4新郑市2郑州
2郑州1河南省
1河南省
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值