Sql 查询选择下一个id订单
我有一张带有ID和NextID的表,如下所示:Sql 查询选择下一个id订单,sql,sql-server,Sql,Sql Server,我有一张带有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
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
有人能帮我吗
谢谢对于这种特殊情况,您可以使用right join进行订购
select t2.*
from some_table t1
right join some_table t2
on t1. main_id = t2.next_id
order by case when t2.next_id is null then 9999999 else t2.main_id + t2.next_id end;
order by part中的999999将最后一行6(null)放在输出的末尾
如果对实际数据采用查询,祝您好运递归cte将按访问节点的顺序返回行
with t as (
select f.*, right('00000000'+cast(f.mainId as varchar(max)),9) path
from yourtable f
where MainID=1
union all
select f.*, path + '->' + right('00000000'+cast(f.mainId as varchar(max)),9)
from t
join yourtable f on t.NextID = f.MainID
)
select *
from t
order by path
其中MainId=1是任意开始。你也可以从
如果不存在,请从表f2中选择1,其中f2.Nextid=f.MainId
编辑
通过添加明确的顺序这完全是我想要的,如果MainID=1可以更灵活地获得最低的主id数据,那将是完美的,谢谢!!可能在不存在的地方从表f2中选择1,其中f2.Nextid=f.MainIdNo,此代码以任意顺序返回行,因为外部查询中没有order by。代码可能会以特定顺序返回行,但这是巧合,没有order by不能保证。@GordonLinoff,谢谢,添加了order by根据问题指南,请显示您尝试过的内容,并告诉我们您在本网站或其他地方发现了什么,以及为什么它不能满足您的需要。编辑,我真的很抱歉