SQL按同级值排序
我有两列,它们的名称是SQL按同级值排序,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有两列,它们的名称是id和sibling\u id,类型是uniqueidentifier我想通过sibling\u id以编程方式按id排序。我的数据结构如下所示,因此可以更改值 id sibling_id ------------------------------------ ------------------------------------ 4146831B-79FA-6EB4-981B-FF0000
id
和sibling\u id
,类型是uniqueidentifier
我想通过sibling\u id
以编程方式按id
排序。我的数据结构如下所示,因此可以更改值
id sibling_id
------------------------------------ ------------------------------------
4146831B-79FA-6EB4-981B-FF00002477F7 78068B1B-79FA-6EB4-981B-FF00002477F7
53058B1B-79FA-6EB4-981B-FF00002477F7 00000000-0000-0000-0000-000000000000
5B058B1B-79FA-6EB4-981B-FF00002477F7 30718C1B-79FA-6EB4-981B-FF00002477F7
78068B1B-79FA-6EB4-981B-FF00002477F7 5B058B1B-79FA-6EB4-981B-FF00002477F7
80068B1B-79FA-6EB4-981B-FF00002477F7 4146831B-79FA-6EB4-981B-FF00002477F7
30718C1B-79FA-6EB4-981B-FF00002477F7 53058B1B-79FA-6EB4-981B-FF00002477F7
预计订单如下所示
Order id sibling_id
------ ------------------------------------ ------------------------------------
1 53058B1B-79FA-6EB4-981B-FF00002477F7 00000000-0000-0000-0000-000000000000
2 30718C1B-79FA-6EB4-981B-FF00002477F7 53058B1B-79FA-6EB4-981B-FF00002477F7
3 5B058B1B-79FA-6EB4-981B-FF00002477F7 30718C1B-79FA-6EB4-981B-FF00002477F7
4 78068B1B-79FA-6EB4-981B-FF00002477F7 5B058B1B-79FA-6EB4-981B-FF00002477F7
5 4146831B-79FA-6EB4-981B-FF00002477F7 78068B1B-79FA-6EB4-981B-FF00002477F7
6 80068B1B-79FA-6EB4-981B-FF00002477F7 4146831B-79FA-6EB4-981B-FF00002477F7
您可以使用获取订单:
;WITH TraverseTree AS (
-- Anchor query: get root node
SELECT 1 as [order], id, sibling_id
FROM mytable AS t
WHERE NOT EXISTS (SELECT 1
FROM mytable AS x
WHERE x.id = t.sibling_id)
UNION ALL
-- Recursive query: get node of next level
SELECT t2.[order] + 1 AS [order], t1.id, t1.sibling_id
FROM mytable AS t1
JOIN TraverseTree AS t2 ON t1.sibling_id = t2.id
)
SELECT *
FROM TraverseTree
ORDER BY [order]
CTE
首先选择根节点,即没有父节点的记录。根据提供的样本数据,该记录为:
53058B1B-79FA-6EB4-981B-FF00002477F7 00000000-0000-0000-0000-000000000000
然后重复执行递归查询,直到它不返回任何记录。第一次执行时,将选择上一条记录的子记录:
30718C1B-79FA-6EB4-981B-FF00002477F7 53058B1B-79FA-6EB4-981B-FF00002477F7
以此类推,直到整个树都被遍历
注意:字段名同级id
有点误导。在我看来,它应该被称为父亲id
在查询结束时按兄弟姐妹id下单?我不理解输出排序和要求您的预期顺序对我来说没有意义。你能澄清一下吗?哦,那是一棵树。。。那为什么是“兄弟姐妹”呢?@GuidoG你懂什么?你有什么问题?如果它可以按兄弟姐妹的id订购,我可以这样做。我想通过同胞值来订购id值。非常感谢,这是一个很好的示例,但我有大量的SELECT查询。我在这里只写了两个科尔曼。有没有办法在t-sql的经典逐行排序中使用这种方法?我认为没有办法使用标准sql查询获得节点的深度(在上面的查询中名为
[ORDER]
)。您可以编辑发布的查询,以便添加您喜欢的任何其他列。好的,再次感谢您。我已经用了两个CTE和你的建议,它的工作就像一个魅力。