表Sort
SortID 字段SortName 字段UpSortID
1      A     0
2      B     0
3      C     0
4      D     1
5      E     1
6      F     1
7      G     2
8      H     3
9      I     3我想实现查询结果:A D
  E
  FB GC H
  I不知大家看懂了没有,其实这是个父菜单、子菜单的表,UpSortID为0的是父菜单,其他是子菜单,想要查询父菜单(不重复)和相应的子菜单。其实完全可以用两个表来实现,但是数据表已经设计好了,不允许再改动,能不能用SQL语句来实现以上查询呢?求教高手。
我用的一个自身连接查询
SELECT s1.SortName AS '父类名称', s2.SortName AS '子类名称'
FROM Sort s1 JOIN Sort s2 ON s2.UpSortID = s1.SortID
WHERE s2.UpSortID > 0
但是父菜单会有重复值,请问要怎么做呢?

解决方案 »

  1.   

    --如果只有两层,可如下,如果是多层就麻烦了.
    create table tb(SortID int,SortName varchar(10),UpSortID int)
    insert into tb values(1 ,'A', 0)
    insert into tb values(2 ,'B', 0)
    insert into tb values(3 ,'C', 0)
    insert into tb values(4 ,'D', 1)
    insert into tb values(5 ,'E', 1)
    insert into tb values(6 ,'F', 1)
    insert into tb values(7 ,'G', 2)
    insert into tb values(8 ,'H', 3)
    insert into tb values(9 ,'I', 3)
    goselect m.SortName SortName1 , n.SortName SortName2 from tb m left join tb n 
    on m.SortID = n.UpSortID
    where m.UpSortID = 0 and n.UpSortID <> 0
    /*
    SortName1  SortName2  
    ---------- ---------- 
    A          D
    A          E
    A          F
    B          G
    C          H
    C          I(所影响的行数为 6 行)
    */select SortName1 = (case when SortName2 = (select top 1 SortName2 from 
    (
    select m.SortName SortName1 , n.SortName SortName2 from tb m left join tb n 
    on m.SortID = n.UpSortID
    where m.UpSortID = 0 and n.UpSortID <> 0
    ) t2 where t2.SortName1 = t1.SortName1) then t1.SortName1 else '' end),
           SortName2
    from
    (
    select m.SortName SortName1 , n.SortName SortName2 from tb m left join tb n 
    on m.SortID = n.UpSortID
    where m.UpSortID = 0 and n.UpSortID <> 0
    ) t1 
    /*
    SortName1  SortName2  
    ---------- ---------- 
    A          D
               E
               F
    B          G
    C          H
               I(所影响的行数为 6 行)
    */drop table tb
      

  2.   

    if object_id('[Sort]') is not null drop table [Sort]
    go
    create table [Sort]([SortID] int,[SortName] varchar(1),[UpSortID] int)
    insert [Sort]
    select 1,'A',0 union all
    select 2,'B',0 union all
    select 3,'C',0 union all
    select 4,'D',1 union all
    select 5,'E',1 union all
    select 6,'F',1 union all
    select 7,'G',2 union all
    select 8,'H',3 union all
    select 9,'I',3select sortname=case when b.rn=1 then a.sortname else '' end,b.sortname
    from
    (select *,rn=row_number() over(order by sortid) from sort where upsortid=0) a
    left join
    (select *,rn=row_number() over(partition by upsortid order by sortid) from sort where upsortid!=0) b
    on a.sortid=b.upsortid /**
    sortname sortname
    -------- --------
    A        D
             E
             F
    B        G
    C        H
             I(6 行受影响)
    **/