有一张用户表,里面的用户有推荐关系!我现在新增了几个新用户!我想往推荐人身上加积分!假如 A→B→C→D→E→F→G→H
→表示推荐我现在获取到了H   H用户有一个字段是他的推荐人ID我如何往G上加完推荐积分,
然后在查G的推荐人F,往F头上加积分之后
又查到F的推荐人E。这样一直循环加到A
用游标可以实现嘛 !??

解决方案 »

  1.   


    if object_id('[tb]') is not null drop table [tb]
    create table [tb] (id int,name varchar(1),pid int)
    insert into [tb]
    select 1,'A',0 union all
    select 2,'B',1 union all
    select 3,'D',1 union all
    select 4,'C',2 union all
    select 5,'D',2 union all
    select 6,'A',4 union all
    select 7,'E',5 union all
    select 8,'F',5
    GO
    ;with cte
    as
    (
        select   *,[path]=cast([name]+'->' as varchar(100)) ,[level] = 1 from tb where pid = 0
        union all
        select a.*,  cast(c.[path]+a.[name]+'->' as varchar(100)),[level]+1 from cte c ,tb a where a.pid = c.id
    )
    select 

    from cte
    where len([path]) > 6 and right([path],3) = left([path],3)
    /*
    id          name pid         path           level
    ----------- ---- ----------- -------------- -----
    6           A    4           A->B->C->A->     4(1 行受影响)
    */------------------------------------------------------------------------
    -- Author : happyflystone  
    -- Date   : 2010-04-06 
    -- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86) 
    --          Apr 14 2006 01:12:25 
    --          Copyright (c) 1988-2005 Microsoft Corporation
    --          Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
    --      
    -------------------------------------------------------------------------- Test Data: ta
    IF OBJECT_ID('[tb]') IS NOT NULL 
        DROP TABLE [tb]
    Go
    CREATE TABLE tb([cid] NVARCHAR(1),[pid] NVARCHAR(1))
    Go
    INSERT INTO tb
        SELECT 'A','B' UNION ALL
        SELECT 'A','D' UNION ALL
        SELECT 'B','C' UNION ALL
        SELECT 'B','D' UNION ALL
        SELECT 'C','A' UNION ALL
        SELECT 'D','E' UNION ALL
        SELECT 'D','F' 
    GO
    --Start
    ;with cte
    as
    (
        select   *,[path]=cast([cid]+'->' as varchar(100)) ,[level] = 1 
        from (select distinct cid,cast('' as nvarchar(1))  as pid from tb union  select distinct pid ,'' from tb) b 
        union all
        select a.*,cast(a.[cid]+'->'+c.[path] as varchar(100)),[level]+1 
        from cte c ,tb a 
        where a.pid = c.cid and charindex(a.[cid]+'->',c.[path])=0
    )
    select 
    [path]+cid+'->'
    from cte
    where exists(select 2 from tb where cid+'->' = right([path],3) and pid+'->' = left([path],3))-- = left([path],3)
    --Result:
    /*
    --------------
    A->B->C->A->
    C->A->B->C->
    B->C->A->B->(3 行受影响)*/
    --End 
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2010/04/06/5456223.aspxBOM循环问题,参考上诉资料
      

  2.   

    参考下面的内容,自己修改一下即可.
    /*
    标题:SQL SERVER 2000中查询指定节点及其所有父节点的函数(表格形式显示)
    作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开) 
    时间:2008-05-12
    地点:广东深圳
    */create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
    insert into tb values('001' , null  , '广东省')
    insert into tb values('002' , '001' , '广州市')
    insert into tb values('003' , '001' , '深圳市')
    insert into tb values('004' , '002' , '天河区')
    insert into tb values('005' , '003' , '罗湖区')
    insert into tb values('006' , '003' , '福田区')
    insert into tb values('007' , '003' , '宝安区')
    insert into tb values('008' , '007' , '西乡镇')
    insert into tb values('009' , '007' , '龙华镇')
    insert into tb values('010' , '007' , '松岗镇')
    go--查询指定节点及其所有父节点的函数
    create function f_pid(@id varchar(3)) returns @t_level table(id varchar(3))
    as
    begin
      insert into @t_level select @id
      select @id = pid from tb where id = @id and pid is not null
      while @@ROWCOUNT > 0
      begin
        insert into @t_level select @id 
        select @id = pid from tb where id = @id and pid is not null
      end
      return
    end
    go--调用函数查询002(广州市)及其所有父节点
    select a.* from tb a , f_pid('002') b where a.id = b.id order by a.id
    /*
    id   pid  name       
    ---- ---- ---------- 
    001  NULL 广东省
    002  001  广州市(所影响的行数为 2 行)
    */--调用函数查询003(深圳市)及其所有父节点
    select a.* from tb a , f_pid('003') b where a.id = b.id order by a.id
    /*
    id   pid  name       
    ---- ---- ---------- 
    001  NULL 广东省
    003  001  深圳市(所影响的行数为 2 行)
    */--调用函数查询008(西乡镇)及其所有父节点
    select a.* from tb a , f_pid('008') b where a.id = b.id order by a.id
    /*
    id   pid  name       
    ---- ---- ---------- 
    001  NULL 广东省
    003  001  深圳市
    007  003  宝安区
    008  007  西乡镇(所影响的行数为 4 行)
    */drop table tb
    drop function f_pid@@ROWCOUNT:返回受上一语句影响的行数。
    返回类型:integer。
    注释:任何不返回行的语句将这一变量设置为 0 ,如 IF 语句。
    示例:下面的示例执行 UPDATE 语句并用 @@ROWCOUNT 来检测是否有发生更改的行。UPDATE authors SET au_lname = 'Jones' WHERE au_id = '999-888-7777'
    IF @@ROWCOUNT = 0
       print 'Warning: No rows were updated'结果:(所影响的行数为 0 行)
    Warning: No rows were updated
    /*
    标题:SQL SERVER 2005中查询指定节点及其所有父节点的方法(表格形式显示)
    作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开) 
    时间:2010-02-02
    地点:新疆乌鲁木齐
    */create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
    insert into tb values('001' , null  , N'广东省')
    insert into tb values('002' , '001' , N'广州市')
    insert into tb values('003' , '001' , N'深圳市')
    insert into tb values('004' , '002' , N'天河区')
    insert into tb values('005' , '003' , N'罗湖区')
    insert into tb values('006' , '003' , N'福田区')
    insert into tb values('007' , '003' , N'宝安区')
    insert into tb values('008' , '007' , N'西乡镇')
    insert into tb values('009' , '007' , N'龙华镇')
    insert into tb values('010' , '007' , N'松岗镇')
    goDECLARE @ID VARCHAR(3)--查询ID = '001'的所有父节点
    SET @ID = '001'
    ;WITH T AS
    (
      SELECT ID , PID , NAME 
      FROM TB
      WHERE ID = @ID
      UNION ALL
      SELECT A.ID , A.PID , A.NAME 
      FROM TB AS A JOIN T AS B ON A.ID = B.PID
    )
    SELECT * FROM T ORDER BY ID
    /*
    ID   PID  NAME
    ---- ---- ----------
    001  NULL 广东省(1 行受影响)
    */--查询ID = '002'的所有父节点
    SET @ID = '002'
    ;WITH T AS
    (
      SELECT ID , PID , NAME 
      FROM TB
      WHERE ID = @ID
      UNION ALL
      SELECT A.ID , A.PID , A.NAME 
      FROM TB AS A JOIN T AS B ON A.ID = B.PID
    )
    SELECT * FROM T ORDER BY ID
    /*
    ID   PID  NAME
    ---- ---- ----------
    001  NULL 广东省
    002  001  广州市(2 行受影响)
    */--查询ID = '003'的所有父节点
    SET @ID = '003'
    ;WITH T AS
    (
      SELECT ID , PID , NAME 
      FROM TB
      WHERE ID = @ID
      UNION ALL
      SELECT A.ID , A.PID , A.NAME 
      FROM TB AS A JOIN T AS B ON A.ID = B.PID
    )
    SELECT * FROM T ORDER BY ID
    /*
    ID   PID  NAME
    ---- ---- ----------
    001  NULL 广东省
    003  001  深圳市(2 行受影响)
    */--查询ID = '009'的所有父节点
    SET @ID = '009'
    ;WITH T AS
    (
      SELECT ID , PID , NAME 
      FROM TB
      WHERE ID = @ID
      UNION ALL
      SELECT A.ID , A.PID , A.NAME 
      FROM TB AS A JOIN T AS B ON A.ID = B.PID
    )
    SELECT * FROM T ORDER BY ID
    /*
    ID   PID  NAME
    ---- ---- ----------
    001  NULL 广东省
    003  001  深圳市
    007  003  宝安区
    009  007  龙华镇(4 行受影响)
    */drop table tb--注:除ID值不一样外,四个SQL语句是一样的。
      

  3.   


    --查询ID = '009'的所有父节点
    SET @ID = '009'
    ;WITH T AS
    (
      SELECT ID , PID , NAME 
      FROM TB
      WHERE ID = @ID
      UNION ALL
      SELECT A.ID , A.PID , A.NAME 
      FROM TB AS A JOIN T AS B ON A.ID = B.PID
    )
    SELECT * FROM T ORDER BY ID
    这里得到的数据如何循环呢?可以弄到游标里面循环吗?还是我定义个游标 查询语句就是这样的?
      

  4.   

    那你看看如下的示例吧:
    /*
    标题:SER SERVER 2005中统计各节点及其子节点的数量及合计(逐级汇总)
    作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开) 
    时间:2011-05-06
    地点:重庆航天职业学院id   pid  name       cnt
    ---- ---- ---------- -----------
    001  NULL 广东省        0
    002  001  广州市        0
    003  001  深圳市        0
    004  002  天河区        0
    005  003  罗湖区        0
    006  003  福田区        0
    007  003  宝安区        0
    008  007  西乡镇        1
    009  007  龙华镇        2
    010  007  松岗镇        3
    011  006  岗下镇        4
    012  005  上沙镇        5
    013  004  天河镇        6-->统计结果如下:
    id   name       unit        sum_cnt
    ---- ---------- ----------- -----------
    001  广东省        13          21
    002  广州市        3           6
    003  深圳市        9           15
    004  天河区        2           6
    005  罗湖区        2           5
    006  福田区        2           4
    007  宝安区        4           6
    008  西乡镇        1           1
    009  龙华镇        1           2
    010  松岗镇        1           3
    011  岗下镇        1           4
    012  上沙镇        1           5
    013  天河镇        1           6*/create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10) , cnt int)
    insert into tb values('001' , null  , N'广东省' , 0)
    insert into tb values('002' , '001' , N'广州市' , 0)
    insert into tb values('003' , '001' , N'深圳市' , 0)
    insert into tb values('004' , '002' , N'天河区' , 0)
    insert into tb values('005' , '003' , N'罗湖区' , 0)
    insert into tb values('006' , '003' , N'福田区' , 0)
    insert into tb values('007' , '003' , N'宝安区' , 0)
    insert into tb values('008' , '007' , N'西乡镇' , 1)
    insert into tb values('009' , '007' , N'龙华镇' , 2)
    insert into tb values('010' , '007' , N'松岗镇' , 3)
    insert into tb values('011' , '006' , N'岗下镇' , 4)
    insert into tb values('012' , '005' , N'上沙镇' , 5)
    insert into tb values('013' , '004' , N'天河镇' , 6)
    go;WITH T AS
    (
      SELECT ID , PID , NAME , CNT FROM TB 
      UNION ALL
      SELECT B.ID , A.PID , A.NAME , B.CNT FROM TB AS A JOIN T AS B ON A.ID = B.PID 
    )
    SELECT p.id , p.name , count(1) unit, sum(t.cnt) sum_cnt FROM tb p , t 
    where isnull(p.pid,'000') = isnull(t.pid,'000') and p.name = t.name group by p.id , p.name order by p.id drop table tb
      

  5.   

    已经解决了!用的while循环=。=呵呵!!!!!给分