我有一张表,上面有id和nextid,如下所示:
MainID || NextID
1 || 2
2 || 3
3 || 5
4 || 6
5 || 4
6 || ...
... || ...
我想要实现的是像这样选择数据
MainID || NextID
1 || 2
2 || 3
3 || 5
5 || 4
4 || 6
6 || ...
... || ...
我尝试的是简单的查询,比如:
SELECT * FROM 'table' ORDER BY NextID
但它当然不能满足我的需要,我有一个想法,创建一个临时表和插入与循环,但需要太多的时间来完成:
WHILE @NextID IS NOT NULL
BEGIN
INSERT INTO 'table'(MainID, NextID)
SELECT MainID, NextId
FROM 'table' WHERE MainID=@NextID
END
有人能帮我吗?
谢谢
2条答案
按热度按时间dfddblmv1#
对于这种特殊情况,您可以使用右连接进行排序
“order by”部分中的999999将把最后一行(6,null)放在输出的末尾。
祝您在对真实数据采用查询时好运
rt4zxlrg2#
递归cte将按访问节点的顺序返回行
db<>小提琴
where MainId=1
是一个任意的开始。你也可以从where not exists (select 1 from yourtable f2 where f2.Nextid = f.MainId)
编辑添加显式
order by