****关于分类和产品,根据分类捞取该分类下及子分类下的产品的所有记录。。请大侠门来帮忙呀。。敬礼!
表结构如下:
product表
id name categoryid
1 体育信息 1
2 文娱信息 2
3 健康信息 3
4 足球信息 4
5 蓝球信息 5
6 明星信息 6
7 趣事信息 7
8 保健信息 8
9 足球世界杯信息 9
category表
categoryid categoryname parentid
1 体育 0
2 文娱 0
3 健康 0
4 足球 1
5 蓝球 1
6 明星 2
7 趣事 2
8 保健 3
9 足球世界杯 4
现在的select下拉框如下显示 :
*************************
体育
--足球
--足球世界杯
--蓝球
文娱
--明星
--趣事
健康
--保健
*************************
如果我选择 "体育 ",希望捞到记录1,4,5,9
如果我选择 "足球 ",希望捞到记录4,9
如果我选择 "足球世界杯 ",希望捞到记录9
也就是选取大类时要把子类中的记录也捞出来。。
请问怎么写SQL才会更合适。。因为我写的速度太慢
[解决办法]
写个函数返回所有子类
create function fn_allsub(
@categoryid int
)
returns @r table (categoryid int,categoryname varchar(30),parentid int)
as
begin
insert @r select * from category where categoryid=@categoryid
while exists (select 1 from category where parentid in (select categoryid from @r) and categoryid not in (select categoryid from @r))
insert @r select * from category where parentid in (select categoryid from @r) and categoryid not in (select categoryid from @r)
return
end
go
--查询
select a.* from product a,dbo.fn_allsub(1) b
where a.categoryid=b.categoryid
[解决办法]
--建立函數
Create Function F_GetChildren(@categoryname Nvarchar(20))
Returns @Tree Table (categoryid Int, categoryname Nvarchar(20), parentid Int)
As
Begin
Insert @Tree Select * From category Where categoryname = @categoryname
While @@Rowcount > 0
Insert @Tree Select A.* From category A Inner Join @Tree B On A.parentid = B.categoryid And A.categoryid Not In (Select categoryid From @Tree)
Return
End
GO
--測試
Select * From dbo.F_GetChildren(N '体育 ')
Select * From dbo.F_GetChildren(N '足球 ')