Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL按同级值排序_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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和你的建议,它的工作就像一个魅力。