标题:求助:如何查询分类下的所有子类?
只看楼主
球球
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:1146
专家分:265
注 册:2005-11-28
结帖率:100%
 问题点数:0 回复次数:14 
求助:如何查询分类下的所有子类?
select * from ProductType t where t.ParentID = @ParentID
union all
select * from ProductType t where t.ProdtypeID = @ParentID
这样只能查询下一级的子类,如果下一级的子类里还有子类就查不出来了.
搜索更多相关主题的帖子: 子类 ParentID ProductType select 分类 
2007-12-05 16:35
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
得分:0 
--测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
    SET @Level=@Level+1
    INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
    FROM @t a,@t_Level b
    WHERE a.PID=b.ID
        AND b.Level=@Level-1
END

--显示结果
SELECT SPACE(b.Level*2)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
|--山东省
  |--烟台市
    |--招远市
  |--青岛市
|--四会市
  |--清远市
    |--小分市
--*/

我的msn: myfend@
2007-12-05 16:41
球球
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:1146
专家分:265
注 册:2005-11-28
得分:0 
呵呵,谢谢啊,purana斑竹.

好累
2007-12-05 17:30
球球
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:1146
专家分:265
注 册:2005-11-28
得分:0 
我是想通过一个分类的ID,来查询这个分类下的所有子类.

好累
2007-12-05 17:37
球球
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:1146
专家分:265
注 册:2005-11-28
得分:0 
如果分类名后面带有数字,分类就乱了.

好累
2007-12-05 20:03
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
得分:0 
你把表结构和数据..贴出来看看.

我的msn: myfend@
2007-12-05 20:10
XieLi
Rank: 1
等 级:新手上路
威 望:1
帖 子:762
专家分:0
注 册:2007-7-24
得分:0 
又值得学习了! WHILE @@ROWCOUNT>0 代替了游标!

[[italic] 本帖最后由 XieLi 于 2007-12-5 20:57 编辑 [/italic]]

拥有蓝天的白云,拥有你的我.
2007-12-05 20:33
球球
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:1146
专家分:265
注 册:2005-11-28
得分:0 
create table ProductType
(
prodTypeId int identity(1,1) primary key,
prodTypeName varchar(50),--分类名
parentId int,--父ID,第一级为0
Remark varchar(200),--描述
prodNumber int--分类里的产品数量
)

insert into ProductType values('手机',0,'手机手机手机手机手机手机',0)
insert into ProductType values('数码相机',0,'数码相机数码相机数码相机数码相机数码相机',0)
insert into ProductType values('摄像机',0,'摄像机摄像机摄像机摄像机',0)
insert into ProductType values('CPU',0,'CPUCPUCPUCPU',0)
insert into ProductType values('主板',0,'主板主板主板主板',0)
insert into ProductType values('硬盘',0,'硬盘硬盘硬盘硬盘',0)
insert into ProductType values('高清电视',0,'高清电视高清电视高清电视高清电视',0)
insert into ProductType values('MP3',0,'MP3MP3MP3MP3',0)
insert into ProductType values('MP4',0,'MP4MP4MP4MP4',0)
insert into ProductType values('耳机',0,'耳机耳机耳机耳机耳机',0)
insert into ProductType values('鼠标',0,'鼠标鼠标鼠标鼠标鼠标',0)
insert into ProductType values('内存条',0,'内存条内存条内存条内存条',0)
insert into ProductType values('显示器',0,'显示器显示器显示器显示器显示器',0)
insert into ProductType values('键盘',0,'键盘键盘键盘键盘',0)
insert into ProductType values('CPU风扇',0,'CPU风扇CPU风扇CPU风扇CPU风扇',0)
insert into ProductType values('机箱电源',0,'机箱电源机箱电源机箱电源机箱电源',0)
insert into ProductType values('U盘',0,'U盘U盘U盘U盘',0)
insert into ProductType values('移动硬盘',0,'移动硬盘移动硬盘移动硬盘移动硬盘',0)
insert into ProductType values('电脑附件',0,'电脑附件电脑附件电脑附件电脑附件',0)
insert into ProductType values('其它',0,'其它其它其它其它',0)

insert into producttype values('大哥大',1,'属性于手机类',0)
insert into producttype values('大哥大1_1',21,'属性于大哥大类',0)
insert into producttype values('大哥大1_1_1',22,'属性于大哥大1-1-1类',0)
insert into producttype values('CPU1_1',4,'属于CPU大类',0)
insert into producttype values('CPU1_1_1',23,'属于CPU1-1分类',0)

可能插入的数据有些不对.一开始主键是自动增长的,但为了实现递归删除,后面又把主键改了.

我现在就是想实现根据一个分类的ID,查出这个分类下的所有子类.

好累
2007-12-06 11:16
purana
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:广东-广州
等 级:版主
威 望:66
帖 子:6039
专家分:0
注 册:2005-6-17
得分:0 
是这样子吗?.
create table ProductType
(
prodTypeId int identity(1,1) primary key,
prodTypeName varchar(50),--分类名
parentId int,--父ID,第一级为0
Remark varchar(200),--描述
prodNumber int--分类里的产品数量
)

insert into ProductType values('手机',0,'手机手机手机手机手机手机',0)
insert into ProductType values('数码相机',0,'数码相机数码相机数码相机数码相机数码相机',0)
insert into ProductType values('摄像机',0,'摄像机摄像机摄像机摄像机',0)
insert into ProductType values('CPU',0,'CPUCPUCPUCPU',0)
insert into ProductType values('主板',0,'主板主板主板主板',0)
insert into ProductType values('硬盘',0,'硬盘硬盘硬盘硬盘',0)
insert into ProductType values('高清电视',0,'高清电视高清电视高清电视高清电视',0)
insert into ProductType values('MP3',0,'MP3MP3MP3MP3',0)
insert into ProductType values('MP4',0,'MP4MP4MP4MP4',0)
insert into ProductType values('耳机',0,'耳机耳机耳机耳机耳机',0)
insert into ProductType values('鼠标',0,'鼠标鼠标鼠标鼠标鼠标',0)
insert into ProductType values('内存条',0,'内存条内存条内存条内存条',0)
insert into ProductType values('显示器',0,'显示器显示器显示器显示器显示器',0)
insert into ProductType values('键盘',0,'键盘键盘键盘键盘',0)
insert into ProductType values('CPU风扇',0,'CPU风扇CPU风扇CPU风扇CPU风扇',0)
insert into ProductType values('机箱电源',0,'机箱电源机箱电源机箱电源机箱电源',0)
insert into ProductType values('U盘',0,'U盘U盘U盘U盘',0)
insert into ProductType values('移动硬盘',0,'移动硬盘移动硬盘移动硬盘移动硬盘',0)
insert into ProductType values('电脑附件',0,'电脑附件电脑附件电脑附件电脑附件',0)
insert into ProductType values('其它',0,'其它其它其它其它',0)

insert into producttype values('大哥大',1,'属性于手机类',0)
insert into producttype values('大哥大1_1',21,'属性于大哥大类',0)
insert into producttype values('大哥大1_1_1',22,'属性于大哥大1-1-1类',0)
insert into producttype values('CPU1_1',4,'属于CPU大类',0)
insert into producttype values('CPU1_1_1',24,'属于CPU1-1分类',0)
go

CREATE FUNCTION f_Sort(@ID int=0,@sort int=1)
RETURNS @t_Level TABLE(ID char(3),sort int)
AS
BEGIN
    DECLARE tb CURSOR LOCAL
    FOR
    SELECT prodTypeId FROM ProductType
    WHERE parentId=@ID
        --OR(@ID IS NULL AND PID IS NULL)
    OPEN TB
    FETCH tb INTO @ID
    WHILE @@FETCH_STATUS=0
    BEGIN
        INSERT @t_Level VALUES(@ID,@sort)
        SET @sort=@sort+1
        IF @@NESTLEVEL<32 --如果递归层数未超过32层(递归最大允许32层)
        BEGIN
            --递归查找当前节点的子节点
            INSERT @t_Level SELECT * FROM f_Sort(@ID,@sort)
            SET @sort=@sort+@@ROWCOUNT  --排序号加上子节点个数
        END
        FETCH tb INTO @ID
    END
    RETURN
END
GO

SELECT a.*
FROM ProductType a,dbo.f_Sort(21,DEFAULT) b
WHERE a.prodTypeId=b.ID
ORDER BY b.sort

drop function f_Sort
drop table ProductType

--上面查的是prodTypeId为21的分类
/*
prodTypeId  prodTypeName    parentId    Remark             prodNumber  
----------- --------------------- ----------- --------------------- -----------
22          大哥大1_1                 21          属性于大哥大类       0
23          大哥大1_1_1             22          属性于大哥大1-1-1类  0

(所影响的行数为 2 行)
*/

我的msn: myfend@
2007-12-06 15:30
XieLi
Rank: 1
等 级:新手上路
威 望:1
帖 子:762
专家分:0
注 册:2007-7-24
得分:0 
呵呵!还是用到函数啦!

拥有蓝天的白云,拥有你的我.
2007-12-06 15:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-190583-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.549458 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved