要求
        /*递归3层查询
         * 表LKS_T
         * 字段有MID、PID、Mtxt
         * 先查出Mtxt='文件'的MID和Mtxt 重命名为MID1和Mtxt1
         * 根据查来的MID1,查询MID和Mtxt,条件PID=MID1 重命名为MID2和Mtxt2
         * 根据查来的MID2,查询MID和Mtxt,条件PID=MID2 重命名为MID3和Mtxt3
         * 要得到的结果:MID1 txt1 MID2 txt2 MID3 txt3
         * 结束
         */

解决方案 »

  1.   


    IF NOT OBJECT_ID('tb') IS NULL 
        DROP TABLE tb
    create table tb (mid varchar(50), pid varchar(50),mtxt varchar(50))
    insert into tb select 'a1','a2','a'
    insert into tb select 'a2','a3','b'
    insert into tb select 'a3','a4','c'with at as
    (select a.mid,a.pid,a.mtxt ,1 as levl from tb a where  a.mtxt='a'---- a1为参数
    union all
    select a.mid,a.pid,a.mtxt,levl + 1 from tb a join at on  a.mid=at.pid
    )
    select max(case when levl=1 then mid else null end )'mid1',max(case when levl=1 then mtxt else null end) 'txt1' 
    ,max(case when levl=2 then mid else null end) 'mid2',max(case when levl=2 then mtxt else null end )'txt2'  
    ,max(case when levl=3 then mid else null end) 'mid3',max(case when levl=3 then mtxt else null end )'txt3'
    from at
    /*
    mid1 txt1 mid2 txt2 mid3 txt3
    a1 a a2 b a3 c
      

  2.   

    先根据Mtxt='测试1' 查下去
    MID   PID   Mtxt
    2      0     测试110     2     测试211     10    测试3要得到的结果是:
    MID1  MTXT1    MID2  MTXT2   MID3  MTXT3
    2       测试1    10    测试2   11    测试3  
      

  3.   


    --> 测试数据:[test]
    if object_id('[test]') is not null drop table [test]
    create table [test]([MID] int,[PID] int,[Mtxt] varchar(5))
    insert [test]
    select 2,0,'测试1' union all
    select 10,2,'测试2' union all
    select 11,10,'测试3'select t.*,m.MID as mid3,m.Mtxt as mtxt3 from (
    select a.MID as mid1,a.Mtxt Mtxt1,b.MID mid2,b.Mtxt Mtxt2  from test a
    inner join test b on a.MID=b.PID)t
    inner join test m on t.mid2=m.PID
    /*
    mid1 Mtxt1 mid2 Mtxt2 mid3 mtxt3
    2 测试1 10 测试2 11 测试3
    */三层递归没有必要用cte
      

  4.   

    a.mid=at.pid
    改成a.pid=at.mid 
    就对了 呵呵