这函数用于输出树杈真是超级方便,就是性能上没测试,有试过的给个回复。
直接看语句吧:
Oracle:
select t.id,'|-'||LPAD('--', 2*(LEVEL-1),'-')||t.name from T_SYS_ORG t start with t.parentid is null and t.status = 1
connect by prior t.id = t.parentid ORDER SIBLINGS BY t.sortorder
MSSQL:
drop table #t1
CREATE TABLE #t1
(
c1 varchar(20),
c2 char(20),
c3 int
)
GO
INSERT INTO #t1 VALUES ('2', 'a',1)
INSERT INTO #t1 VALUES ('37', 'bc',2)
INSERT INTO #t1 VALUES ('597', 'esdfsd',3)
GO
SELECT
c1,c2,
'|'+REPLICATE('--', c3) + rtrim(c1) AS [aaa],
REPLICATE('--', c3) + rtrim(c2) AS [bbb],
rtrim(c1) + REPLICATE('--', c3) AS ccc,
rtrim(c2) + REPLICATE('--', c3) AS ddd
FROM #t1
下面是转载的一份:
在ORACLE、MSSQL、MYSQL中树结构表递归查询的实现方法
表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 id=1 connect by prior id(子层的列)=parentid(属于顶层的列) 语句说明:
start with 指定层次开始的条件,即满足这个条件的行即可以作为层次树的最顶层 connect by prior指层之间的关联条件,即什么样的行是上层行的子行(自连接条件) 实例:
select * from recursionstart with id=1 connect by prior id=parented
查询结果:
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 id=@id
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 b. parentid =1) (查询parentid为某个值的所有子节点)
查询结果:
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