id  root name
1   0    a
2   1    a-1
3   2    a-2
4   0    b
5   4    b-1这种结构的库,就是像那种目录树无限级的,现要取比如id为1开始递归的所有记录,就是把id等于1、2、3的记录全取出来,SQL该如何写?

解决方案 »

  1.   

    create table tb
    (
    id int ,
    root int,
    name varchar(5)
    )insert into tb 
    select 1,0,'a' union all
    select 2,1,'a-1' union all
    select 3,2,'a-2' union all
    select 4,0,'b' union all
    select 5,4,'b-1'
    godeclare @id int
    set @id=1
    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 tb
    WHERE id=@id
    WHILE @@ROWCOUNT>0
    BEGIN
    SET @Level=@Level+1
    INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
    FROM tb a,@t_Level b
    WHERE a.root=b.ID
    AND b.Level=@Level-1
    END
    --执行
    SELECT a.*
    FROM tb a,@t_Level b
    WHERE a.ID=b.ID
    ORDER BY b.Sort
    --结果
    (0 行受影响)
    id          root        name
    ----------- ----------- -----
    1           0           a
    2           1           a-1
    3           2           a-2(3 行受影响)
      

  2.   

    如果不写存储过程行吗,因为这个功能我还要用在ACCESS里的
      

  3.   

    那就得用程序与 access库共同实现了吧。思路跟上面一样就成。