SQL语句问题!

snowcloud2002 2004-01-30 03:54:14
表名:Test
字段名:
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

求这个SQL语句。
...全文
43 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
vme 2004-02-02
  • 打赏
  • 举报
回复

/*
以下可以实现楼主所说的功能,但有个前提就是父ID的值必须比子ID的值小。
原理:构造一个新的表(多了个OrderID(排序)),从旧的表中读取数据,插入到新的表中。程序的主要任务就是判断插入的位置,如果在新的表中存在父ID,新的数据就会插入到父ID之下(以OrderID从大到小排序,OrderID值为父ID的OrderID值+1,并且把新表中ID比父ID值大的OrderID+1),如果不存在直接插入,OrderID值为当前新表的行数。

为解决的问题。
1,同级的会采用ID倒序排列(parentid=0除外)
2,父ID必须比子ID先插入到新表中,不然就会出现错误。
3,还没想到。。。

大家看看可不可以改进下

@CurID 当前ID
@Rowcount 总行数
@ParentID 父级ID
@Curcount 当前行数
*/
use test

Declare @CurID int,@Rowcount int,@orderID int,@ParentID int,@Curcount int
Declare @temTb TABLE (ID int,name char(10),orderID int)

Set @Rowcount=(select sum(id) from test)
Set @Curcount=1
set @CurID=(select top 1 id from test order by id)

while @Rowcount>0
begin
set @ParentID=(select id from @temTb where id=(select parentid from test where id=@CurID))
if (@ParentID is null)
begin
Set @orderID=@Curcount-1
end
else
begin
Set @orderID=(select orderID from @temTb where id =@ParentID)
update @temTb set orderID=orderID+1 where orderID>@orderID
end
insert into @temTb (ID,name,orderID) SELECT ID,name,@orderID+1 FROM Test WHERE id=@CurID
Set @CurID=(select top 1 id from test where id>@CurID order by id)
Set @Rowcount=@Rowcount-1
Set @Curcount=@Curcount+1
end
select * from @temTb order by orderID
zhuomaocn 2004-01-30
  • 打赏
  • 举报
回复
楼主的表设计的不合理,怎么样也要这样吧

id name parentid
1 aa 0
2 bb 0
3 aa1 1
4 aa2 1
5 bb1 2
6 bb2 2



snowcloud2002 2004-01-30
  • 打赏
  • 举报
回复
我是要做树,最好能一条sql生成数据

而且我只要一张表
蛋高8 2004-01-30
  • 打赏
  • 举报
回复
我知道了,你是要按照parentid这个字段的值来排序对吧
蛋高8 2004-01-30
  • 打赏
  • 举报
回复
我怎么还没看懂
loveweb 2004-01-30
  • 打赏
  • 举报
回复
select name from test order by name,parentid
测试结果:
aa
aa1
aa2
bb
bb1
bb2
vme 2004-01-30
  • 打赏
  • 举报
回复
如果做树的话,用单一个sql语句好象挺难的,一般用递归的方法。
bflovesnow 2004-01-30
  • 打赏
  • 举报
回复
看下这段你或许有启发。
这段是根据任一个parentid,查询出该 parentid 下的所有记录。
而你的要求要比这个复杂一层:

DECLARE @intRowCount int
SET @intLevel = 1
DECLARE @bbb TABLE (ID int,Level int)

INSERT INTO @bbb (ID,Level) SELECT ID,@intLevel FROM Test WHERE parentid IN (0)--这里以parentid为选择条件
SELECT @intRowCount = @@ROWCOUNT
WHILE @intRowCount > 0
BEGIN
INSERT INTO @bbb (ID,Level) SELECT ID,@intLevel + 1 FROM Test WHERE parentid IN
(SELECT ID FROM @bbb WHERE Level = @intLevel)
SELECT @intRowCount = @@ROWCOUNT
SET @intLevel = @intLevel + 1
END
select * from @bbb
kanzai 2004-01-30
  • 打赏
  • 举报
回复
做树是经常用到的技术,我一般都这么做。
只用一个字段来显示树就够了,
id name parentid
1 aa 0
2 bb 0
3 aa1 1
4 aa2 3
5 bb1 2
6 bb2 5
改成
id name
001 aa
002 bb
001001 aa1
001001001 aa2
002001 bb1
002001001 bb2
然后显示的时候按id排序,如果想倒序的话,就是先显示002,再显示001,就只好先把id长度为3的显示出来,然后再显示id like '001%' and len(id)<>3的内容。

这样做的好处是,维护树很容易,并且会很准确的知道数据的具体位置。
vivisogood 2004-01-30
  • 打赏
  • 举报
回复
楼主能把意思再说清楚吗?
TrueAndFalse 2004-01-30
  • 打赏
  • 举报
回复
不知道是不是这个意思
TrueAndFalse 2004-01-30
  • 打赏
  • 举报
回复
select a.*,b.* from test a,tablename b where a.parentid=b.id order by a.parentid
loveweb 2004-01-30
  • 打赏
  • 举报
回复
晕写错字了
写不出
树形要这样做出来好难啊
vivisogood 2004-01-30
  • 打赏
  • 举报
回复

select * from test order by parentid,name
还是
select * from test order by name,parentid
TrueAndFalse 2004-01-30
  • 打赏
  • 举报
回复
select a.*,b.* from test a,tablename b where a.parentid=b.id order by a.parentid
zhuomaocn 2004-01-30
  • 打赏
  • 举报
回复
select * from test order by name,parentid
loveweb 2004-01-30
  • 打赏
  • 举报
回复
写不错啊
学习
x_gn 2004-01-30
  • 打赏
  • 举报
回复
select * from test order by name,parentid
stefli 2004-01-30
  • 打赏
  • 举报
回复
不清楚你要解决什么问题?说具体点。
loveweb 2004-01-30
  • 打赏
  • 举报
回复
楼上的理解错了
楼主做树?
加载更多回复(1)

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧