父子类排序
表A,有四个字段,父类ParentID,子类ChildID,所处级别Level,大分类SortID
ChildID ParentID Level SortID
A A 1 类型一
B B 1 类型一
C C 1 类型二
D D 1 类型一
AA A 2 类型一
AAA AA 3 类型一
DD D 2 类型一
…
要求排序之后成为
A A 1 类型一
AA A 2 类型一
AAA AA 3 类型一
B B 1 类型一
D D 1 类型一
DD DD 2 类型一
C C 1 类型二
即要求先按SortID分类,之后根据父子关系排序,Level是层次关系,如果父子关系Level相差值为1,我想在SQL里面实现,调试很久多没办法实现,请各位高手帮忙给点意见,我之前是多增加一个编号,然后在程序里面实现的,感觉那个很容易出现问题,而且计算比较繁琐
[解决办法]
可行的方法有很多种,基于你目前的表结构,如果层次深度不超过三级,用左连接应该可以处理。
[解决办法]
declare @t table(ChildID varchar(10),ParentID varchar(10),Level int,SortID nvarchar(10))
insert into @t select 'A ', 'A ',1, '类型一 '
insert into @t select 'B ', 'B ',1, '类型一 '
insert into @t select 'C ', 'C ',1, '类型二 '
insert into @t select 'D ', 'D ',1, '类型一 '
insert into @t select 'AA ', 'A ',2, '类型一 '
insert into @t select 'AAA ', 'AA ',3, '类型一 '
insert into @t select 'DD ', 'D ',2, '类型一 '
SELECT *
FROM @t
ORDER BY SortID, ParentID, Level
===
ChildID ParentID Level SortID
---------- ---------- ----------- ----------
A A 1 类型一
AA A 2 类型一
AAA AA 3 类型一
B B 1 类型一
D D 1 类型一
DD D 2 类型一
C C 1 类型二
[解决办法]
create table tablesort
(
ChildID varchar(10),
ParentID varchar(10),
Level int ,
SortID varchar(10)
)
delete tablesort
insert into tablesort
select 'A ' , 'A ' , '1 ' , '一 ' union all select
'B ' , 'B ' , '1 ' , '一 ' union all select
'C ' , 'C ' , '1 ' , '二 ' union all select
'D ' , 'D ' , '1 ' , '一 ' union all select
'AA ' , 'A ' , '2 ' , '一 ' union all select
'AAA ', 'AA ' , '3 ' , '一 ' union all select
'DD ' , 'D ' , '2 ' , '一 '
select * from tablesort order by SortID, ChildID
ChildID ParentID Level SortID
---------- ---------- ----------- ----------
A A 1 类型一
AA A 2 类型一
AAA AA 3 类型一
B B 1 类型一
D D 1 类型一
DD D 2 类型一
C C 1 类型二
[解决办法]
--drop table TAA
create TABLE TAA( ChildID nvarchar(10), ParentID nvarchar(10), Level int , SortID nvarchar(10))
insert into Taa
select
'A ' , 'A ' , 1 , N '类型一 '
UNION SELECT 'B ' , 'B ' , 1 , N '类型一 '
UNION SELECT 'C ' , 'C ' , 1 , N '类型二 '
UNION SELECT 'D ' , 'D ' , 1 , N '类型一 '
UNION SELECT 'AA ' , 'A ' , 2 , N '类型一 '
UNION SELECT 'AAA ' , 'AA ', 3 , N '类型一 '
UNION SELECT 'DD ' , 'D ' , 2 , N '类型一 '
CREATE FUNCTION dbo.taa_order (@ParentID nvarchar(10),@Level int)
RETURNS nvarchar(20) AS
BEGIN
declare @aa nvarchar(20)
declare @i int
set @i=1
if @Level=1
select @aa=@ParentID
if @Level <> 1
begin
select @aa=ParentID FROM TAA where ChildID=@ParentID
while exists (select 1 from taa where ChildID=@aa and Level> 1)
begin
select @aa=ParentID FROM TAA where ChildID=@aa
end
end
return @aa
END
我也写了一个函数,LZ看一下
select *,dbo.taa_order(ParentID,Level) from Taa
order by SortID,dbo.taa_order(ParentID,Level),Level
AA1类型一A
AAA2类型一A
AAAAA3类型一A
BB1类型一B
DD1类型一D
DDD2类型一D
CC1类型二C