产品类别cplb表存储如下:id pid mc
1 0 牛奶
2 0 面包
3 1 酸奶
4 1 鲜奶
5 1 奶粉
6 3 光明
7 3 蒙牛
8 6 350克装
9 6 1000克装
…………我的问题是这样的,在查询的时候,当选择类别为"牛奶"的时候,能够得到下面所有子类的ID号如:1,3,4,5,6,7,8,9,如果在选择酸奶的时候应该得到:3,6,7,8,9,如果选择鲜奶的时候应该得到:4,不知道有没有语句可以实现这种无限级的查询,我只会两级,呵呵:select id from cplb where id=1 or pid=1
请高手指导,在线等
1 0 牛奶
2 0 面包
3 1 酸奶
4 1 鲜奶
5 1 奶粉
6 3 光明
7 3 蒙牛
8 6 350克装
9 6 1000克装
…………我的问题是这样的,在查询的时候,当选择类别为"牛奶"的时候,能够得到下面所有子类的ID号如:1,3,4,5,6,7,8,9,如果在选择酸奶的时候应该得到:3,6,7,8,9,如果选择鲜奶的时候应该得到:4,不知道有没有语句可以实现这种无限级的查询,我只会两级,呵呵:select id from cplb where id=1 or pid=1
请高手指导,在线等
create table os(id int,parentid int,desn varchar(10))
insert into os select 1,0,'体育用品'
insert into os select 2,0,'户外运动'
insert into os select 3,1,'篮球'
insert into os select 4,1,'足球'
insert into os select 5,2,'帐篷'
insert into os select 6,2,'登山鞋'
insert into os select 7,0,'男士用品'
insert into os select 8,7,'刮胡刀'
insert into os select 9,3,'大号篮球'--首先查找该节点下所有子接点
create function f_cid(@id int)
returns varchar(500)
as
begin
declare @t table(id int,parentid int,desn varchar(10),lev int)
declare @lev int
set @lev=1
insert into @t select *,@lev from os where id=@id
while(@@rowcount>0)
begin
set @lev=@lev+1
insert into @t select a.*,@lev from os a,@t b
where a.parentid=b.id and b.lev=@lev-1
end
declare @cids varchar(500)
select @cids=isnull(@cids+',','')+ltrim(id) from @t order by lev
return @cids
end
go--查找1下面的id
select dbo.f_cid(1)
CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
INSERT tb 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','小分市'
GO--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@ID char(3))
RETURNS @t_Level TABLE(ID char(3),Level int)
AS
BEGIN
DECLARE @Level int
SET @Level=1
INSERT @t_Level SELECT @ID,@Level
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level
FROM tb a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
RETURN
END
GO--调用函数查询002及其所有子节点
SELECT a.*
FROM tb a,f_Cid('002') b
WHERE a.ID=b.ID
/*--结果
ID PID Name
------ ------- ----------
002 001 烟台市
004 002 招远市
--*/
--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (id INT,pid INT,mc NVARCHAR(8))
INSERT INTO #T
SELECT '1','0','牛奶' UNION ALL
SELECT '2','0','面包' UNION ALL
SELECT '3','1','酸奶' UNION ALL
SELECT '4','1','鲜奶' UNION ALL
SELECT '5','1','奶粉' UNION ALL
SELECT '6','3','光明' UNION ALL
SELECT '7','3','蒙牛' UNION ALL
SELECT '8','6','350克装' UNION ALL
SELECT '9','6','1000克装'--SQL查询如下:--05CTE递归;WITH Liang
AS
(
SELECT id,mc
FROM #T
WHERE mc=N'牛奶'
UNION ALL
SELECT t.id,t.mc
FROM Liang AS l
JOIN #T AS t
ON l.id=t.pid
)
SELECT *
FROM Liang/*
id mc
----------- --------
1 牛奶
3 酸奶
4 鲜奶
5 奶粉
6 光明
7 蒙牛
8 350克装
9 1000克装(8 行受影响)*/