日期:2014-05-18  浏览次数:20465 次

******请问,我希望得到这样的查询结果,Sql语句应该怎么写?******
数据库中是以无序的规则存储的数据
MenuID     ParentID     Name
10 000000     F1
101010 1030     F1F3F1
1010 10     F1F1
1030 10     F1F3
102010 1010     F1F1F1
102020 1010     F1F1F2
102020 1020     F1F2F2
101030 1030     F1F3F3
101020 1030     F1F3F2
102010 1020     F1F2F1
1020 10     F1F2

我希望查询出的结果是这样排序的,
即按照:父节点,子节点1,子节点1的子节点,子节点2,子节点2的子节点:
注意:数据库中的Name部分不是像下面这样,
我这里只是举个例子
MenuID     ParentID     Name
10 000000     F1
1010 10     F1F1
102010 1010     F1F1F1
102020 1010     F1F1F2
1020 10     F1F2
102010 1020     F1F2F1
102020 1020     F1F2F2
1030 10     F1F3
101010 1030     F1F3F1
101020 1030     F1F3F2
101030 1030     F1F3F3

------解决方案--------------------
create table tab(MenuID varchar(10),ParentID varchar(10), Name varchar(10))
insert tab
select '10 ', '000000 ', 'F1 '
union all select '101010 ', '1030 ', 'F1F3F1 '
union all select '1010 ', '10 ', 'F1F1 '
union all select '1030 ', '10 ', 'F1F3 '
union all select '102010 ', '1010 ', 'F1F1F1 '
union all select '102020 ', '1010 ', 'F1F1F2 '
union all select '102020 ', '1020 ', 'F1F2F2 '
union all select '101030 ', '1030 ', 'F1F3F3 '
union all select '101020 ', '1030 ', 'F1F3F2 '
union all select '102010 ', '1020 ', 'F1F2F1 '
union all select '1020 ', '10 ', 'F1F2 '

select * from tab order by left(MenuID+ '0000000000 ',20)

drop table tab

/* 结果

MenuID ParentID Name
---------- ---------- ----------
10 000000 F1
1010 10 F1F1
101010 1030 F1F3F1
101020 1030 F1F3F2
101030 1030 F1F3F3
1020 10 F1F2
102010 1020 F1F2F1
102010 1010 F1F1F1
102020 1010 F1F1F2
102020 1020 F1F2F2
1030 10 F1F3

(11 row(s) affected)


*/


------解决方案--------------------
这不就是深度排序么?
------解决方案--------------------
--测试数据
DECLARE @t TABLE(ID int,PID int,Name nvarchar(10))
INSERT @t
select '10 ', '000000 ', 'F1 ' union all
select '101010 ', '1030 ', 'F1F3F1 ' union all
select '1010 ', '10 ', 'F1F1 ' union all
select '1030 ', '10 ', 'F1F3 ' union all
select '102010 ', '1010 ', 'F1F1F1 ' union all
select '102020 ', '1010 ', 'F1F1F2 ' union all
select '102020 ', '1020 ', 'F1F2F2 ' union all
select '101030 ', '1030 ', 'F1F3F3 ' union all
select '101020 ', '1030 ', 'F1F3F2 ' union all
select '102010 ', '1020 ', 'F1F2F1 ' union all
select '1020 ', '10 ', 'F1F2 '

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)