none
层级查询(急) RRS feed

  • 问题

  • Create table #tb(id int,pid int,tag bit,name varchar(50))
    insert into #tb
    select 1,0,0,'湖南' union all
    select 2,1,0,'岳阳' union all
    select 3,1,0,'郴州' union all
    select 4,1,0,'长沙' union all
    select 5,4,0,'雨花区' union all
    select 6,0,1,'北京' union all
    select 7,6,0,'海淀区' union all
    select 8,6,0,'朝阳区' union all
    select 9,0,0,'上海'

    select * from #tb
    --1.查询没有子级的数据(id:2,3,5,7,8,9)
    --2.查询没有子级的数据,并且父级tag为1,则不查询子级(id:2,3,5,6,9)
    --3.查询有子级,并且pid为0的数据(id:1,4,6,9)

    • 已编辑 HUGO.CM 2011年4月14日 6:09
    2011年4月14日 1:50

答案

  • 1 select * from @tb As T where T.id not in (select pid from @tb )

    2 select * from @tb As T ,@tb As S where  S.id = T.pid and S.tag = 1 Or (T.id not in (select pid from @tb ) )

    3 select * from @tb As T where T.id not in (select pid from @tb ) and T.pid = 0

     

    这么简单的问题,不知道为什么没人回答你,难道大家都去春游去了?

     

     


    • 已编辑 msbyebye 2011年4月14日 6:02 拼写错误
    • 已标记为答案 HUGO.CM 2011年4月14日 6:43
    2011年4月14日 5:59
  • 哎~是很简单,为什么我当时脑子就转不过弯来!
    只有第一个是对的,其他2个都查不出。

    正确的结果应该是下面的:(根据你的思路)

    select * from #tb where id not in (select pid from #tb )

    select * from #tb where id not in (select pid from #tb)
    and id not in (select A.id from #tb A inner join #tb B on B.id = A.pid and B.tag = 1)
    or id in (select A.pid from #tb A inner join #tb B on B.id = A.pid and B.tag = 1)

    select * from #tb  where id in (select pid from #tb ) or pid = 0

    • 已标记为答案 HUGO.CM 2011年4月14日 6:43
    2011年4月14日 6:42

全部回复

  • 1 select * from @tb As T where T.id not in (select pid from @tb )

    2 select * from @tb As T ,@tb As S where  S.id = T.pid and S.tag = 1 Or (T.id not in (select pid from @tb ) )

    3 select * from @tb As T where T.id not in (select pid from @tb ) and T.pid = 0

     

    这么简单的问题,不知道为什么没人回答你,难道大家都去春游去了?

     

     


    • 已编辑 msbyebye 2011年4月14日 6:02 拼写错误
    • 已标记为答案 HUGO.CM 2011年4月14日 6:43
    2011年4月14日 5:59
  • 哎~是很简单,为什么我当时脑子就转不过弯来!
    只有第一个是对的,其他2个都查不出。

    正确的结果应该是下面的:(根据你的思路)

    select * from #tb where id not in (select pid from #tb )

    select * from #tb where id not in (select pid from #tb)
    and id not in (select A.id from #tb A inner join #tb B on B.id = A.pid and B.tag = 1)
    or id in (select A.pid from #tb A inner join #tb B on B.id = A.pid and B.tag = 1)

    select * from #tb  where id in (select pid from #tb ) or pid = 0

    • 已标记为答案 HUGO.CM 2011年4月14日 6:43
    2011年4月14日 6:42