最近用到了oracle的start with函数,所以在这里简单的记录一下:
首先可以造一个表字段很简单,如下:
-- Create table
create table CODE
(
id NUMBER,
name VARCHAR2(20),
pid NUMBER
)
tablespace TSDACNS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
创建了一个code表,表里只有三个字段,分别是id,name,pid,插入以下数据:
insert into code (ID, NAME, PID)
values (1, '中国', null);
insert into code (ID, NAME, PID)
values (2, '河南', 1);
insert into code (ID, NAME, PID)
values (3, '河北', 1);
insert into code (ID, NAME, PID)
values (4, '平顶山', 2);
insert into code (ID, NAME, PID)
values (5, '漯河', 2);
insert into code (ID, NAME, PID)
values (6, '安阳', 2);
insert into code (ID, NAME, PID)
values (7, '唐山', 3);
insert into code (ID, NAME, PID)
values (8, '保定', 3);
insert into code (ID, NAME, PID)
values (9, '天津', 3);
以上为插入的数据,通过以下sql可以查询出带有层级的结果:
select * from code start with id = 1 connect by prior id = pid
查询出来的效果是这样的:
再来看看默认的查询效果:
接下来对这个函数进行简单的解释,start with是根节点的限定语句,当然可以放宽条件,有多个根节点,取到多棵树。connect by prior是连接条件,其中prior表示上一条记录,例如当前例子的connect by prior id = pid,意思就是上条记录的id是本条数据的父级id。