树(tree)结构表递归查询的实现方法总结
2016-01-22 13:48
507 查看
表recursion数据如下:
id
name parentid
1 食品分类 -1
2 肉类 1
3 蔬菜类 1
4 产品分类 -1
5 保健品 4
6 医药 4
7 建筑 4
一 ORACLE中实现方法:
Oracle中直接支持,使用语句select * from tablename start with connect by
prior id(子层的列)=parentid(属于顶层的列)
语句说明:
start with 指定层次开始的条件,即满足这个条件的行即可以作为层次树的最顶层
connect by prior指层之间的关联条件,即什么样的行是上层行的子行(自连接条件)
实例:
select * from recursionstart with connect by prior>查询结果:
id name parentid
1 食品分类 -1
2 肉类 1
3 蔬菜类 1
二 MSSQL中的实现方法
在MSSQL中需要使用临时表和循环多次查询的方式实现.
创建函数:
create function GetRecursion(@id int)
returns @t table(
idint,
namevarchar(50),
parentidint
)
as
begin
insert @tselect * from recursion where> while @@rowcount>0
insert @t select a.* from recursion as a inner join @t as b
on a.parentid=b.id and a.id not in(select id from @t)
return
end
使用方法:
select * from GetRecursion(4)
查询结果:
id name parentid
4 产品分类 -1
5 保健品 4
6 医药 4
7 建筑 4
三 MYSQL中的实现方法
查询语句:
select b.id,b.name,b.parentid from recursion as a, recursion as bwhere
a.id=b.parentid and (a.id=1 or a. parentid =1)
查询结果:
id name parentid
2 肉类 1
3 蔬菜类 1
四 在ORACLE、MSSQL、MYSQL中可以使用下面的查询语句只返回树结构表的子结点数据
select *
from tablename t
where not exists (select 'X'
from tablename t1, tablename t2
where t1.id = t2.parentid
and t1.id = t.id)
如:
select *
from recursion t
where not exists (select 'X'
from recursion t1, recursion t2
where t1.id = t2.parentid
and t1.id = t.id)
查询结果:
id name parentid
2 肉类 1
3 蔬菜类 1
5 保健品 4
6 医药 4
7 建筑 4
五 在ORACLE、MSSQL、MYSQL中可以使用下面的查询语句只返回树结构表的根结点数据
select *
from tablename t
where not exists (select 'X'
from tablename t1, tablename t2
where t1.id = t2.parentid
and t1.id = t. parentid)
如:
select *
from recursion t
where not exists (select 'X'
from recursion t1, recursion t2
where t1.id = t2.parentid
and t1.id = t. parentid)
查询结果:
id name parentid
1 食品分类 -1
4 产品分类 -1
SELECT
t.name,
t.unit_id,
t.parent_id
FROM
`scpi_unit_struct` t
WHERE NOT EXISTS(
select * from `scpi_unit_struct` t1,`scpi_unit_struct`t2
where
t1.unit_id=t2.parent_id AND t.unit_id=t1.unit_id
)
Start with...Connect By子句递归查询
下面是从网上转载的内容:
CREATE
TABLE
TBL_TEST
(
ID
NUMBER,
NAME
VARCHAR2(100 BYTE),
PID
NUMBER DEFAULT
0
);
#插入测试数据:
INSERT
INTO
TBL_TEST(ID,NAME,PID)
VALUES(''''1'''',''''10'''',''''0'''');
INSERT
INTO
TBL_TEST(ID,NAME,PID)
VALUES(''''2'''',''''11'''',''''1'''');
INSERT
INTO
TBL_TEST(ID,NAME,PID)
VALUES(''''3'''',''''20'''',''''0'''');
INSERT
INTO
TBL_TEST(ID,NAME,PID)
VALUES(''''4'''',''''12'''',''''1'''');
INSERT
INTO
TBL_TEST(ID,NAME,PID)
VALUES(''''5'''',''''121'''',''''2'''');
#从Root往树末梢递归
select
* from
TBL_TEST
start
with
id=1
connect
by
prior
id = pid
#从末梢往树ROOT递归
select
* from
TBL_TEST
start
with
id=5
connect
by
prior
pid = id
id
name parentid
1 食品分类 -1
2 肉类 1
3 蔬菜类 1
4 产品分类 -1
5 保健品 4
6 医药 4
7 建筑 4
一 ORACLE中实现方法:
Oracle中直接支持,使用语句select * from tablename start with connect by
prior id(子层的列)=parentid(属于顶层的列)
语句说明:
start with 指定层次开始的条件,即满足这个条件的行即可以作为层次树的最顶层
connect by prior指层之间的关联条件,即什么样的行是上层行的子行(自连接条件)
实例:
select * from recursionstart with connect by prior>查询结果:
id name parentid
1 食品分类 -1
2 肉类 1
3 蔬菜类 1
二 MSSQL中的实现方法
在MSSQL中需要使用临时表和循环多次查询的方式实现.
创建函数:
create function GetRecursion(@id int)
returns @t table(
idint,
namevarchar(50),
parentidint
)
as
begin
insert @tselect * from recursion where> while @@rowcount>0
insert @t select a.* from recursion as a inner join @t as b
on a.parentid=b.id and a.id not in(select id from @t)
return
end
使用方法:
select * from GetRecursion(4)
查询结果:
id name parentid
4 产品分类 -1
5 保健品 4
6 医药 4
7 建筑 4
三 MYSQL中的实现方法
查询语句:
select b.id,b.name,b.parentid from recursion as a, recursion as bwhere
a.id=b.parentid and (a.id=1 or a. parentid =1)
查询结果:
id name parentid
2 肉类 1
3 蔬菜类 1
四 在ORACLE、MSSQL、MYSQL中可以使用下面的查询语句只返回树结构表的子结点数据
select *
from tablename t
where not exists (select 'X'
from tablename t1, tablename t2
where t1.id = t2.parentid
and t1.id = t.id)
如:
select *
from recursion t
where not exists (select 'X'
from recursion t1, recursion t2
where t1.id = t2.parentid
and t1.id = t.id)
查询结果:
id name parentid
2 肉类 1
3 蔬菜类 1
5 保健品 4
6 医药 4
7 建筑 4
五 在ORACLE、MSSQL、MYSQL中可以使用下面的查询语句只返回树结构表的根结点数据
select *
from tablename t
where not exists (select 'X'
from tablename t1, tablename t2
where t1.id = t2.parentid
and t1.id = t. parentid)
如:
select *
from recursion t
where not exists (select 'X'
from recursion t1, recursion t2
where t1.id = t2.parentid
and t1.id = t. parentid)
查询结果:
id name parentid
1 食品分类 -1
4 产品分类 -1
mysql递归查询树形的叶子
t.name,
t.unit_id,
t.parent_id
FROM
`scpi_unit_struct` t
WHERE NOT EXISTS(
select * from `scpi_unit_struct` t1,`scpi_unit_struct`t2
where
t1.unit_id=t2.parent_id AND t.unit_id=t1.unit_id
)
Start with...Connect By子句递归查询
下面是从网上转载的内容:
CREATE
TABLE
TBL_TEST
(
ID
NUMBER,
NAME
VARCHAR2(100 BYTE),
PID
NUMBER DEFAULT
0
);
#插入测试数据:
INSERT
INTO
TBL_TEST(ID,NAME,PID)
VALUES(''''1'''',''''10'''',''''0'''');
INSERT
INTO
TBL_TEST(ID,NAME,PID)
VALUES(''''2'''',''''11'''',''''1'''');
INSERT
INTO
TBL_TEST(ID,NAME,PID)
VALUES(''''3'''',''''20'''',''''0'''');
INSERT
INTO
TBL_TEST(ID,NAME,PID)
VALUES(''''4'''',''''12'''',''''1'''');
INSERT
INTO
TBL_TEST(ID,NAME,PID)
VALUES(''''5'''',''''121'''',''''2'''');
#从Root往树末梢递归
select
* from
TBL_TEST
start
with
id=1
connect
by
prior
id = pid
#从末梢往树ROOT递归
select
* from
TBL_TEST
start
with
id=5
connect
by
prior
pid = id
MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
/article/1563961.html相关文章推荐
- 数据结构学习之栈、队列等
- 算法
- android studio 导入eclipse遇到的相关问题
- Oracle触发器详解
- PageAdapter,FragmentPagerAdapter与FragmentStatePagerAdapter
- 集合初探(八)
- Linux IO 多路复用详解
- Redis和Memcache对比及选择
- visibility和display的区别
- 写了一个小说大纲,可是没时间去完善
- Andorid获取本地电话的方法
- [Unity3D] 战场电视屏幕抖动扭曲Shader
- 数据结构学习之链表
- js之执行环境(作用域)与作用域链深入剖析3
- java ftp相关的异常汇总
- 扑克类的实现
- jar打包成exe,或者服务进行运行
- ECharts 柱状图
- 【PHP进阶篇】3.类与面向对象--慕课网【学习总结】
- 大数据(十三) - Azkaban