posts - 495,comments - 227,trackbacks - 0
最近在做一个图书管理系统,涉及到图书分类的问题。
类别表是book_Catalogs,结构如下
(
fId int, -- 类别编号
fName nvarchar(20), -- 类别名称
fDescription nvarchar(50), -- 类别描述
fParentId int, -- 父级类别
fIsLeaf bit -- 是否叶子类(图书只能归属于叶子类)
)
类别图书关系表是book_CatalogBooks,结构如下
(
fCatalogId int, -- 类别编号
fBookId int, -- 图书编号
)

现在我想通过book_CatalogBooks表查找某一个类别下的所有图书。无论指定哪个类别,都能找到该类别下的所有图书,如果该分类下有子分类,还有包括该类所有子类下的图书。希望能用一个SELECT语句搞定。
 
 
happygong(高兴) 于 2005-10-10 17:08:21

这种树状结构的实现方法不太好
应该使用NodeCode的方法
比如规定以4个字符为单位
0001(父节点)
--00010001(子节点)
----000100010001(孙节点)
----000100010002
--00010002
--00010003
这样记录的树状结构可以使用where nodecode like '00010001%'获得所有00010001下面的子节点
但是有缺点就是同一级最多有10000个,如果还需要更多,可以选择已6个字符为单位
zxbyhcsdn(沙子) 于 2005-10-10 17:12:58

用动态Sql看看!!
libin_ftsafe(子陌红尘) 于 2005-10-10 17:14:54

一条SQL恐怕有些困难,借助UDF:
--------------------------------------------------------------------------------
--创建用户定义函数
declare function f_getchlid(@fId int)
returns @t table(fId int,fName nvarchar(20),fParentId int,fIsLeaf bit,level int)
as
begin
declare @level int
set @level = 1

insert into @t
select
fId,fName,fParentId,fIsLeaf,@level
from
book_Catalogs
where
fId=@fId

while @@rowcount!=0 and exists(select * from @t where level=@level and fIsLeaf=0)
begin
insert into @t
select
a.fId,a.fName,a.fParentId,a.fIsLeaf,@level+1
from
book_Catalogs a,@t b
where
b.fId=a.fParentId
and
b.level=@level

set @level = @level+1
end

return
end
go


--执行查询
declare @fid int
set @fid = 1

select
*
from
book_CatalogBooks
where
fCatalogId in(select a.fId from dbo.f_getchlid(@fid) a where a.fIsLeaf=1)
zxbyhcsdn(沙子) 于 2005-10-10 17:15:00

感觉这个有点的规的样子!!

得到树的深度存储过程:

CREATE PROCEDURE dbo.SpBoardTreeDepth 
AS 
   declare @level int 
   declare @t table(boardid int,pareid int,boardname varchar(50),level int) 
   set @level = 1 
   insert into @t select boardid,pareid,boardname,@level from board where pareid = 0 
   while(@@rowcount>0) 
      begin 
        set @level=@level+1 
        insert into @t 
          select a.boardid,a.pareid,a.boardname,@level from board a 
          join @t b on a.pareid = b.boardid where b.level=@level-1 
      end 
      select boardid,pareid,boardname,level from @t 
      RETURN 
GO 

posted on 2006-09-12 11:15 SIMONE 阅读(698) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: