表A: 
user    lastuser    flag 
11      00 
22      00 
1001    11 
101010  1001 
111111  101010 麻烦在这里,比如我执行一个UPDATE 将11的flag置为1了。 
我需要把11下面的1001也置为1,然后1001改变过后,又要将1001下面的101010又置为1,如果下面还有,比如111111再置 
反之,置0也这样置 这个过程怎么实现好呢?直接通过SQL我好像办不到了大家帮忙想想办法,给点意见,SQL办不到的话,触发器可以办到吗???

解决方案 »

  1.   

    首先要保证user 字段是主键,然后在关系视图中添加两次这张表,然后连接user和lastuser,双击关系链,在里面进行设置
      

  2.   

    create table tb([user] varchar(10),lastuser varchar(10) ,    flag int)
    insert into tb values('11'     , '00' , null)
    insert into tb values('22'     , '00' , null)
    insert into tb values('1001'   , '11' , null)
    insert into tb values('101010' , '1001' , null)
    insert into tb values('111111' , '101010' , null)
    go--查询指定节点及其所有子节点的函数
    create function f_cid(@user varchar(10)) returns @t_level table([user] varchar(10) , level int)
    as
    begin
      declare @level int
      set @level = 1
      insert into @t_level select @user , @level
      while @@ROWCOUNT > 0
      begin
        set @level = @level + 1
        insert into @t_level select a.[user] , @level
        from tb a , @t_Level b
        where a.lastuser = b.[user] and b.level = @level - 1
      end
      return
    end
    go--调用函数查询('11')及其所有子节点
    update tb
    set flag = 1 
    where [user] in
    (select a.[user] from tb a , f_cid('11') b where a.[user] = b.[user])select * from tbdrop table tb
    drop function f_cid/*
    user       lastuser   flag        
    ---------- ---------- ----------- 
    11         00         1
    22         00         NULL
    1001       11         1
    101010     1001       1
    111111     101010     1(所影响的行数为 5 行)
    */在SQL SERVER区中得到解决,也感谢楼上几位!~