表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
但是父菜单会有重复值,请问要怎么做呢?
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
但是父菜单会有重复值,请问要怎么做呢?
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
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 行受影响)
**/