产品类别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.   


    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)
      

  2.   

    --测试数据
    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  招远市
    --*/
      

  3.   

    --> liangCK小梁 于2008-10-13
    --> 生成测试数据: #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 行受影响)*/
      

  4.   

    忘了说了,我用的是access数据库,好像不适合呀!