9

图像您正在为线程化讨论板创建数据库模式。有没有一种有效的方法来为给定线程选择正确排序的列表?我编写的代码有效,但也没有按照我想要的方式排序。

假设您有以下数据:

身份证 | 父母ID
-----------------
1 | 无效的
2 | 1
3 | 2
4 | 1
5 | 3

所以结构应该是这样的:

1
|- 2
| |- 3
| | |- 5
|- 4

理想情况下,在代码中,我们希望结果集按以下顺序出现:1、2、3、5、4
问题:使用我编写的 CTE,它实际上返回为:1、2、4、3、5

我知道这很容易通过使用 LINQ 进行分组/排序,但我不愿意在内存中这样做。不过,这似乎是目前最好的解决方案......

这是我目前使用的 CTE:

with Replies as (   
    select c.CommentID, c.ParentCommentID 1 as Level
        from Comment c
        where ParentCommentID is null and CommentID = @ParentCommentID

    union all

    select c.CommentID, c.ParentCommentID, r.Level + 1 as Level
       from Comment c
       inner join Replies r on c.ParentCommentID = r.CommentID
)

select * from Replies

任何帮助,将不胜感激; 谢谢!



我是 SQL 新手,之前没有听说过 hierarchyid 数据类型。在从这个评论中阅读它之后,我决定我可能想要将它纳入我的设计中。今晚我将对此进行试验,如果成功,我会发布更多信息。



使用 dance2die 的建议更新从我的示例数据返回的结果:

身份证 | 家长 ID | 水平 | 密集等级
-------------------------------------
15 空 1 1
20 15 2 1
21 20 3 1
17 22 3 1
22 15 2 2
31 15 2 3
32 15 2 4
33 15 2 5
34 15 2 6
35 15 2 7
36 15 2 8
4

4 回答 4

8

我相信你会喜欢这个的。我最近发现了Dense_Rank()函数,根据MSDN,该函数用于“在结果集的分区内排名”

查看下面的代码以及“CommentID”是如何排序的。

据我了解,您正在尝试按 ParentCommentID 对结果集进行分区。

注意“denserank”列。

with Replies (CommentID, ParentCommentID, Level) as 
(
        select  c.CommentID, c.ParentCommentID, 1 as Level
        from    Comment c
        where   ParentCommentID is null and CommentID = 1

        union all

        select  c.CommentID, c.ParentCommentID, r.Level + 1 as Level
        from    Comment c
                inner join Replies r on c.ParentCommentID = r.CommentID
)
select  *,
        denserank = dense_rank() over (partition by ParentCommentID order by CommentID)
from    Replies
order by denserank

替代文字

结果如下

于 2009-02-20T04:07:25.793 回答
1

您必须使用 hierarchyid(仅限 sql2008)或一堆字符串(或字节)连接。

于 2009-07-06T21:31:33.863 回答
0

考虑在一个字段中存储整个层次结构(如果它发生变化,使用触发器来更新它)。

您示例中的该字段将具有: 1 1.2 1.2.3 1.2.5 1.4

那么你只需要对该字段进行排序,试试这个看看:

create table #temp (test varchar (10))
insert into #temp (test)
select '1'
union select '1.2'
union select '1.2.3'
union select '1.2.5'
union select '1.4'
select * from #temp order by test asc
于 2009-02-19T18:08:03.747 回答
0

嗯 - 我不确定你的结构是否最适合这个问题。在我的脑海中,无论如何我都无法在上面的查询中根据需要对数据进行排序。

我能想到的最好的方法是如果您有一个将您的评论联系在一起的父表(例如主题表)。如果你这样做了,你应该能够简单地将你的回复加入到那个上面(你显然需要包含正确的列),然后你可以按 topicID、Level 排序以获得你之后的排序顺序(或任何其他信息主题表代表了良好的排序价值)。

于 2009-02-19T16:46:22.933 回答