表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(
id int,
name varchar(50),
parentid int
)
as
begin
insert @t select * 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 b where
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
关于第四,五两点的意义,其实不是很大:
(1)首先,既然是自己建树结构的表,那么对于每颗树的根节点的父节点,一般都会有统一的值,如全部存储:null,0,-1等。其实定义成统一的值,它的好处不言而喻:规范表的数据值;增加可读性,可维护性等。
本例中就是统一存放的-1。 所以没有必须再采用子查询方式,取得树的所有子节点或者所有根节点。
(2)not exists 虽然也能命中索引,但是个人觉得仍然没有通过 parentid = -1 or parentid !=-1 查询的速度快。
分享到:
相关推荐
在ORACLE、MSSQL、MYSQL中树结构表递归查询的实现.pdf
递归查询菜单树,支持mysql,oracle,含表结构,递归查询菜单,支持mysql,oracle,含表结构递归查询菜单。
oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的。这篇文章给大家介绍了Oracle递归树形结构查询功能,需要的朋友参考下
mysql 树形结构查询,使用存储过程,实现mysql的树形结构查询
springJpa单标递归树形结构
在 Oracle 中是通过 start with connect by prior 语法来实现递归查询的。 按照 prior 关键字在子节点端还是父节点端,以及是否包含当前查询的节点,共分为四种情况。 prior 在子节点端(向下递归) 第一种情况: ...
MySQL实现递归查询的三种方式.rar
对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到mysql的递归查询 最近在做项目迁移,Oracle版本的迁到Mysql版本,遇到有些oracle的...
两种mysql递归tree查询效率-mysql递归tree,提供两种递归算法
//组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList ...
Oracle中的树状查询(递归查询),权限查询,树形结构
用递归实现C#树形结构 ,用递归实现C#树形结构 ,
mysql 递归查询 树型结构 代码逻辑
MySQL递归查询,oracle在迁移成mysql后难免会遇到的问题。
地区表MySql递归sql脚本
主要介绍了MyBatis之自查询使用递归实现 N级联动效果,本文给大家分享两种实现方式,需要的的朋友参考下吧
树PostgreSQL的递归查询树PostgreSQL的递归查询树PostgreSQL的递归查询
Oracle使用递归查询。查询树结构的sql。在Oracle中,递归查询要用到start with ……connect by prior……
oracle 如何递归查询父子关系。经常用于构造树结构