Sql server SQL Server,为什么一个order by查询可以处理字符串,而不能处理整数?

Sql server SQL Server,为什么一个order by查询可以处理字符串,而不能处理整数?,sql-server,tsql,Sql Server,Tsql,这是一个简单的示例,说明了在不使用CTE的情况下按父级/子级进行一级深度排序。从这里得到了示例: 我重新创作了这把小提琴,有些东西我不明白 看看这把小提琴,你会发现它在正确地排列父母下面的孩子: 我想以此为例与他人分享,避免使用CTE 有没有人知道如何把这件事做得这么简单,并且仍然遵守父母和孩子的命令?那么,父母的一切都井然有序,而那些父母之下的孩子们按照他们自己的排序也井然有序 --------期望结果的示例---------- 如果表格包括: ID | ParentID | SortOrd

这是一个简单的示例,说明了在不使用CTE的情况下按父级/子级进行一级深度排序。从这里得到了示例:

我重新创作了这把小提琴,有些东西我不明白

看看这把小提琴,你会发现它在正确地排列父母下面的孩子:

我想以此为例与他人分享,避免使用CTE

有没有人知道如何把这件事做得这么简单,并且仍然遵守父母和孩子的命令?那么,父母的一切都井然有序,而那些父母之下的孩子们按照他们自己的排序也井然有序

--------期望结果的示例----------

如果表格包括:

ID | ParentID | SortOrder
-------------------------
1  | NULL     | 1
2  | NULL     | 2
3  | NULL     | 3
4  | 1        | 1
5  | 1        | 2
6  | 3        | 1
我希望查询返回:

ID | ParentID | SortOrder
-------------------------
1  | NULL     | 1
4  | 1        | 1
5  | 1        | 2
2  | NULL     | 2
3  | NULL     | 3
6  | 3        | 1

它与整数与字符串无关。您的小提琴按以下顺序排列:

order by coalesce(ParentID,ID)
这意味着,如果有ParentID,则按其排序,忽略ID。如果没有ParentID,则按ID排序。但每一行都将按单个值排序,因此家长和孩子都将被同等对待

您需要的是按ParentID、ID订购,而不是按ID订购,而是按其排序者订购。这样一来,孩子们就按照自己的顺序在父母的领导下生活

所以在伪代码中:

ORDER BY 
  <sub-query or artificial column that contains SortOrder for Parents and the Parent's SortOrder for children>, 
  <sub-query or artificial column that contains zero for parents and SortOrder for children>
orderby

由于您需要知道父级的排序规则,在子级时,您需要在
ORDER BY
-子句中使用子查询,如其他地方所建议的,或者执行如下自联接(以查找需要最早排序规则的父记录):


按家长排序排序排序、排序。显然ParentSortOrder不是列,但可以在查询中生成。什么是“导致它失败”?我没有看到任何错误。你能提供一个例子,说明你希望正确排序的结果是什么样子吗?@Dan刚刚添加了一个示例编辑的问题。你刚才评论的另一个问题被删除了,但打算说它有效。。。或者似乎是,但还没有完全测试过,现在正在尝试你的建议。我一直使用传统的CTE来处理这个问题,我认为我可能有过复杂的事情。因此,我会为一级和二级创建动态列,使用外部查询进行选择,并根据这两个级别进行排序。我用更多的细节和SQL fiddle链接编辑了我的答案。请注意,答案假设您没有任何排序器小于0.0的记录。0是最低的。现在就试试,回答得很好。因此,对于1级深度模型更好。谢谢:)
SELECT C.Id, C.ParentId, C.SortOrder
FROM Table1 AS C
LEFT JOIN Table1 AS P ON P.Id = C.ParentId
ORDER BY 
    -- This ensures that records are sorted correctly at the parent level:
    COALESCE(P.SortOrder, C.SortOrder), 
    -- This sorts the records at the child level. We need the CASE to make sure parents are sorted before children:
    CASE WHEN C.ParentId IS NULL THEN -1 ELSE C.SortOrder END