How to write sql script to Sort?

ROBOT 2001-02-28 11:08:00
Here a table:
NodeID ParentNodeID DATA
-1 -1
0 -1
1 4
2 1
3 -1
4 0
5 1

I want use SQL script to get a sorted temp table,let childNode always be behind of parentNode
AS:

NodeID ParentNodeID DATA
-1 -1
0 -1
3 -1
4 0
1 4
2 1
5 1
...全文
198 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ROBOT 2001-03-04
  • 打赏
  • 举报
回复
To nono...
Thank you
nononono 2001-03-03
  • 打赏
  • 举报
回复
下面这样简单。呵呵

create table #tmptable (OrderNo int, NodeID int)

declare @NodeLevel int
select @NodeLevel=1

insert into #tmptable (OrderNo, NodeID)
select @NodeLevel, NodeID from tablename where ParentNodeID=-1

update #tmptable set @NodeLevel=0 where NodeID=-1

while (true)
begin

insert into #tmptable (OrderNo, NodeID)
select @NodeLevel+1, b.NodeID
from tablename as a, #tmptable as b
where a.NodeID = b.ParentNodeID and b.OrderNo = @NodeLevel

if @@Rowcount==0
break

select @NodeLevel = @NodeLevel + 1

end
nononono 2001-03-03
  • 打赏
  • 举报
回复
ROBOTROBOT(),我这个方法不复杂,其中没有使用游标、效率不算低。没有用递归,不受层数的限制。

看看别人是不是有基于你现在表结构下更简单的方法。

CrazyP 2001-03-03
  • 打赏
  • 举报
回复
你可以在表中增加一个字段Grade,用来表示级,排序的时候,按照Grade排序即可

ID ParentID Grade
1 NULL 1
2 NULL 1
3 1 2
4 1 2
5 3 3
......
.....


ROBOT 2001-03-03
  • 打赏
  • 举报
回复
To: Nonono...
显然你使用的方法是正确的,但是我想应该有比这更简单的方法?
nononono 2001-03-01
  • 打赏
  • 举报
回复
drop #tmptable1
==>
drop tbale #tmptable1

nononono 2001-03-01
  • 打赏
  • 举报
回复
如果仅仅是要求子结点总是在父结点的后面,但不必相临,下面的代码应该可以作到。我没有运行它,如果你能看明白,相信你能把它调试通过。

create table #tmptable0 (OrderNo int, NodeID int, ParentNodeID int)
create table #tmptable1 (OrderNo int, NodeID int)

declare @PID int, @ONo int
select @PID=-1, @ONo=0

while (true)
begin

insert into #tmptable0 (OrderNo, NodeID, ParentNodeID)
select @ONo, NodeID, ParentNodeID from tablename where ParentNodeID=@PID

insert into #tmptable1 (OrderNo,NodeID)
select @ONo, NodeID from tablename where ParentNodeID=@PID

if @PID=-1
delete from #tmptable1 where NodeID=-1

select top 1 @ONo=OrderNo+1, @PID=NodeID from #tmptable1

if @@RowCount=0 break

delete from #tmptable1 where NodeID=@PID

end

drop #tmptable1

-- 用下面的语句可以得到顺序:子结点总是在父结点的后面。
select a.NodeID, a.ParentNodeID, b.DATA
from #tmptable0 as a join tablename as b on a.NodeID=b.NodeID
order by a.OrderNo

july 2001-03-01
  • 打赏
  • 举报
回复
同意楼上的意见
yaw 2001-03-01
  • 打赏
  • 举报
回复
DB2支持递归,不过最好在建立关系时记录nodeid的层次。
nononono 2001-03-01
  • 打赏
  • 举报
回复
lyre_lj(lyre)想的简单了。如果一个子结点的ID小于父结点的ID,你的结果就不符合ROBOT的原意。
nononono 2001-03-01
  • 打赏
  • 举报
回复
lyre_lj(lyre)想的简单了。如果一个子结点的ID大于父结点的ID,你的结果就不符合ROBOT的原意。
lyre_lj 2001-03-01
  • 打赏
  • 举报
回复
select NodeID,ParentNodeID,DATA from table1 order by ParentNodeID,NodeID
后面的order by 就是排序了。
nononono 2001-02-28
  • 打赏
  • 举报
回复
你的例子中 NodeID=4 也没有紧跟在 NodeID=0 的后面。
nononono 2001-02-28
  • 打赏
  • 举报
回复
如果是下面这样的树,你想能得到什么顺序?

a(b(c,d),e(f,g))

34,872

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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