关于无限级分类的sql语句操作
2007-04-12 19:08
411 查看
还是关于树的算法问题。是树结构就涉及到递归的问题。
众所周知,递归是算法中除图算法外最复杂的一种,关键是在于思想的理解!
另一方面,递归算法,堆栈调用开销相对来说很大。
最近,发现现在很多项目都涉及到这个,树型结构数据报表,树型下拉框,无限级版块分类等等
在实际开发中也很常见。
下面例子中的childs为nvarchar型,保存改目分类下的所有分类项目,写了个函数自动生成
这时,如果想知道某版块下的所有的帖子(包含子版块)
exec 'select * from t_board where boardid=@bid or boardid in (@childids)'
就可以了
--获取所有的下级分类,末尾带,
create function [dbo].[fn_get_childids](@bid int)
returns nvarchar(100)
as
begin
declare @r nvarchar(100)
set @r = ''
declare @tmp int
declare cur cursor for
select boardid from t_board where preid=@bid
open cur
fetch next from cur into @tmp
WHILE (@@FETCH_STATUS <> -1)
BEGIN
set @r = @r + cast(@tmp as nvarchar(10)) + ','
set @r = @r + dbo.fn_get_childids(@tmp)
FETCH NEXT FROM cur INTO @tmp
END
close cur
deallocate cur
return (@r)
/*
update t_board set childids=dbo.fn_get_childids(boardid)
update t_board set childids=left(childids,len(childids)-1) where childids <>''
*/
end
--获取所有上级分类,末尾不带,
create function [dbo].[fn_get_preids](@bid int)
returns nvarchar(100)
as
begin
declare @r nvarchar(100)
set @r = ''
declare @pid int
set @pid=@bid
while @pid>0
begin
select @pid=preid from t_board where boardid=@pid
--print @pid
if(@pid>0) set @r = @r + cast(@pid as nvarchar) + ','
end
if @r<>'' set @r = left(@r,len(@r)-1)
return (@r)
end
众所周知,递归是算法中除图算法外最复杂的一种,关键是在于思想的理解!
另一方面,递归算法,堆栈调用开销相对来说很大。
最近,发现现在很多项目都涉及到这个,树型结构数据报表,树型下拉框,无限级版块分类等等
在实际开发中也很常见。
下面例子中的childs为nvarchar型,保存改目分类下的所有分类项目,写了个函数自动生成
这时,如果想知道某版块下的所有的帖子(包含子版块)
exec 'select * from t_board where boardid=@bid or boardid in (@childids)'
就可以了
--获取所有的下级分类,末尾带,
create function [dbo].[fn_get_childids](@bid int)
returns nvarchar(100)
as
begin
declare @r nvarchar(100)
set @r = ''
declare @tmp int
declare cur cursor for
select boardid from t_board where preid=@bid
open cur
fetch next from cur into @tmp
WHILE (@@FETCH_STATUS <> -1)
BEGIN
set @r = @r + cast(@tmp as nvarchar(10)) + ','
set @r = @r + dbo.fn_get_childids(@tmp)
FETCH NEXT FROM cur INTO @tmp
END
close cur
deallocate cur
return (@r)
/*
update t_board set childids=dbo.fn_get_childids(boardid)
update t_board set childids=left(childids,len(childids)-1) where childids <>''
*/
end
--获取所有上级分类,末尾不带,
create function [dbo].[fn_get_preids](@bid int)
returns nvarchar(100)
as
begin
declare @r nvarchar(100)
set @r = ''
declare @pid int
set @pid=@bid
while @pid>0
begin
select @pid=preid from t_board where boardid=@pid
--print @pid
if(@pid>0) set @r = @r + cast(@pid as nvarchar) + ','
end
if @r<>'' set @r = left(@r,len(@r)-1)
return (@r)
end
相关文章推荐
- 关于sql语句的一些操作 行列转换(转)
- SQL语句中关于日期的操作(非常的有用)
- 关于C#执行多个SQL语句的一些操作——Note on Dec. 19th
- 关于MySql中数据库、表的操作以及增删改查等一些SQL语句注意事项
- oracle之简单的表操作和SQL语句分类
- 关于标准SQL语句的操作
- 关于sql连接语句中的Integrated Security=SSPI 分类: .NET 2015-07-13 11:45 9人阅读 评论(0) 收藏
- 关于mongodb(熟悉MongoDB的数据操作语句,类sql)三
- Sql语句中关于in 参数的操作
- MySQL(三)之SQL语句分类、基本操作、三大范式
- 五、mysql中sql语句分类及常用操作
- SQL 无限级分类语句
- 关于Python操作Mysql数据库时SQL语句的格式问题(mysql语句中的双引号问题)
- 总结一些关于操作数据库是sql语句还是存储过程问题
- SQL 无限级分类语句
- 关于mysql的常见操作SQL语句
- 【自用】无限级分类获取SQL语句
- 关于sql 语句的记录
- sql语句-linq语言-lambda表达式对照 分类: .NET 2014-08-16 04:02 250人阅读 评论(0) 收藏
- 作为开发者必须掌握的mysql操作sql语句优化 - show processlist and explain