一个高手写的递归遍历多层结构的存储过程(转载)
有一个存储新闻分类的表(mulu)字段如下:
mulu_id (int) 分类表里用的唯一ID,自动生成
mulu_fid (int) 父ID,0表示根目录
mulu_name (varchar(255)) 分类名称
还有一个存储新闻内容的表(news)主要字段如下:
news_id (int) 新闻表里唯一ID,自动生成
mulu_id (int) 对应mulu表里的mulu_id
news_title (varchar(300)) 新闻标题
.....
.....
mulu表内容如下:
mulu_name mulu_id mulu_fid
===========================
'首页新闻' 1 0
'心情故事' 2 1
'网友推荐' 3 1
'游戏相关' 4 3
'其它' 5 3
.....
.....
问题:
如何用sql语句把'首页新闻'分类及它的子分类下的所有新闻读出来
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER Function [dbo].[getResourceClass]
(
@ResClassID int
)
/*
根据资源分类ID返回所有由下一级ID组成的字符串列表
Create By Huang Jie 2007-5-25
Drop Function getResourceClass
*/
Returns varchar(800)
As
Begin
Declare @Res varchar(800),
@ResID int
Set @Res = ''
Declare myCurrsor Cursor For --声明游标
Select ResClassID from ResourcesClass where ResParentID=@ResClassID
Open myCurrsor --打开游标
Fetch Next from myCurrsor into @ResID --读取一条游标中数据存入变量中
While @@Fetch_Status = 0 --表示读取到数据,相当于 ADO 中 Not Eof
Begin
if Exists(Select 1 from ResourcesClass where ResParentID=@ResID)
Set @Res = @Res + dbo.getResourceClass(@ResID)
--else
Set @Res = @Res + cast(@ResID as varchar(10)) + ','
Fetch Next from myCurrsor into @ResID --下一条,相当 ADO 中 MoveNext
End
Close myCurrsor --关闭游标
Deallocate myCurrsor --删除游标
Return @Res
End
----------------------------
使用递规的方法把子类ID全部找出来,然后 select ... where mulu_id in()