oracle 数据库提供递归查询语句:
start with connect by prior:
create table provincial_city ( parentid varchar2(10), subid varchar2(10));
insert into provincial_city values ( '陕西省', '西安市' ); insert into provincial_city values ( '陕西省', '宝鸡市' ); insert into provincial_city values ( '陕西省', '咸阳市' ); insert into provincial_city values ( '陕西省', '商洛' ); insert into provincial_city values ( '山西', '运城' ); insert into provincial_city values ( '山西', '太原' ); insert into provincial_city values ( '山西', '吕梁' ); insert into provincial_city values ( '宝鸡市', '扶风县' ); insert into provincial_city values ( '宝鸡市', '凤翔县' ); insert into provincial_city values ( '宝鸡市', '陈仓区' ); insert into provincial_city values ( '西安市', '蓝天' ); insert into provincial_city values ( '西安市', '周至' );
大多项目中基本都会有住址城市的选项,一般情况省市县都会在一个表中存放作为数据字典。下来就演示怎样使用sql查询树状结构。
要求给出其中一个结点值,求其最终父结点。以“扶风县”为例,看一下代码
select a.parentid,a.subid ,level from provincial_city a
start with a.subid='扶风县'
connect by subid= prior parentid
order by level desc;
parentid subid level level可以理解为当前节点下有几个子节点
陕西省 宝鸡市 3
宝鸡市 扶风县 1
start with 子句:遍历起始条件,有个小技巧,如果要查父结点,这里可以用子结点的列,反之亦然。
connect by 子句:连接条件。关键词prior,prior跟父节点列parentid放在一起,就是往父结点方向遍历;prior跟子结点列subid放在一起,则往叶子结点方向遍历,
parentid、subid两列谁放在“=”前都无所谓,关键是prior跟谁在一起。
order by 子句:排序,不用多说。