楼上的兄弟,按你的要求和你写出来的效果不符嘛?
应该是
aa
bb
才对啊?
还是我理解错误!?
应该是
aa
bb
才对啊?
还是我理解错误!?
解决方案 »
- sql 如何去掉0
- 请教如何判断某表中指定的字段是否存在,如果不存在就新建该字段。
- 怎样查询显示除了前N条记录外的前M条记录?
- 很急!!!为什么利用存储过程,取得的记录集就不支持AbslutePage
- 菜鸟的问题
- 怎样往image类型字段中存放照片
- 加入一个触发器后,数据表就不再修改任何列的数据??
- 下面分别是一个将Excel导入到SQLServer数据库,SQLServer数据库的一个表导出到Excel的代码.但都提示同一个错误??
- 高手指路:我要做网上网下数据库同步怎么做?
- SQL行转不定列的问题
- 关于数据库与事务日志的理解上的误区,希望得到各位老师指点,谢谢!
- 初学者问个排序问题?谢谢!
如果要显示上面结果的SELECT * FROM Test ORDER BY name
如果要显示parentid=0的记录然后依次显示parentid=id的记录的
SELECT * FROM Test ORDER BY parentid
create function f_sort()
returns @re table(id int,sortid varchar(1000),level int)
as
begin
declare @level int
set @level=0
insert into @re
select id,right('0000'+cast(id as varchar),4),0
from test where parentid=0
while @@rowcount>0
begin
set @level=@level+1
insert into @re
select a.id,b.sortid+','+right('0000'+cast(a.id as varchar),4),@level
from test a join @re b on a.parentid=b.id
where b.level=@level-1
end
return
end
go--调用自定义函数实现你的排序
select a.* from test a join dbo.f_sort() b on a.id=b.id
order by b.sortid
go
create table Test(id int,name varchar(10),parentid int)
insert into Test
select 1,'aa',0
union all select 2,'bb',0
union all select 3,'aa1',1
union all select 4,'aa2',3
union all select 5,'bb1',2
union all select 6,'bb2',5
go--创建一个辅助排序的函数
create function f_sort()
returns @re table(id int,sortid varchar(1000),level int)
as
begin
declare @level int
set @level=0
insert into @re
select id,right('0000'+cast(id as varchar),4),0
from test where parentid=0
while @@rowcount>0
begin
set @level=@level+1
insert into @re
select a.id,b.sortid+','+right('0000'+cast(a.id as varchar),4),@level
from test a join @re b on a.parentid=b.id
where b.level=@level-1
end
return
end
go--调用自定义函数实现你的排序
select a.* from test a join dbo.f_sort() b on a.id=b.id
order by b.sortid
go--删除测试环境
drop table test
drop function f_sort/*--测试结果
id name parentid
----------- ---------- -----------
1 aa 0
3 aa1 1
4 aa2 3
2 bb 0
5 bb1 2
6 bb2 5(所影响的行数为 6 行)
--*/
http://expert.csdn.net/Expert/topic/2285/2285830.xml?temp=.7908594
declare @test table(id int,name char(10),parentid int)
--测试数据
insert @test
select 1 ,'aa' ,0
union all
select 2 ,'bb' ,0
union all
select 3 ,'aa1' ,1
union all
select 4 ,'aa2' ,3
union all
select 5 ,'bb1' ,2
union all
select 6 ,'bb2' ,5--实现
declare @cs int
set @cs = 0
declare @tree table(id int,cs int,iid int)
Insert @tree Values(0,0,0)
While (@@ROWCOUNT >= 1)
Begin
select @cs = @cs + 1
Insert @tree(id,CS,iid)
Select a.id,@cs,
case when b.cs = 0 then a.id else b.iid end
From @test a,@tree b
Where a.parentid = b.id and b.CS = @cs - 1 and a.id <> a.parentid
End--结果
select t.name from @tree tr join @test t
on tr.id = t.id and tr.cs > 0
order by tr.iid,tr.cs/*
name
----------
aa
aa1
aa2
bb
bb1
bb2 (所影响的行数为 6 行)
*/
目录:访问和更改关系数据-》高级查询概念-》Transact-SQL窍门
字段名:
id name parentid
1 aa 0
2 bb 0
3 aa1 1
4 aa2 3
5 bb1 2
6 bb2 5
我想先显示parentid=0的记录然后依次显示parentid=id的记录如显示下面效果:
aa
aa1
aa2
bb
bb1
bb2
create table cc(id int,name char(10),parentid int)
drop table cc
insert cc(id,name,parentid) values(1,'aa',0)
insert cc(id,name,parentid) values(2,'bb',0)
insert cc(id,name,parentid) values(3,'aa1',1)
insert cc(id,name,parentid) values(4,'aa2',3)
insert cc(id,name,parentid) values(5,'bb1',2)
insert cc(id,name,parentid) values(6,'bb2',5)select id,name,parentid from cc
--select name from cc
where parentid=0 or parentid in (select id from cc)
order by parentid===========
id name parentid
----------- ---------- -----------
1 aa 0
2 bb 0
3 aa1 1
5 bb1 2
4 aa2 3
6 bb2 5(6 row(s) affected)
如果你写的要求,用楼上 shuiniu(飞扬的梦)的测试过的就行了如果要你的结果那样,用下面的就行了:
select name from test order by name
id name parentid
01 aa 0
02 bb 0
0103 aa1 01
010304 aa2 0103
0205 bb1 02
020506 bb2 0205这样一句SELECT就行了
select * from table order by id
然后用程序维护该字段值,使它的值类似于楼上的.
select name from
(select id, name ,parentid,case when parentid=0 then id else parentid end as parentid2 from test ) as aaorder by parentid2,parentid,idaccess中有个iif函数(可以替换case when )不再多写了