你如何在SQL Server中编写有序的递归查询?

时间:2013-07-08 21:26:32

标签: sql-server

这可能已被问过1000次,但我找不到它。

我有以下数据库设计:

Table Comment
ID     UserID     CommentText    DateTime          ReplyTo
1      19823      Nice site!     2013-07-08 11:14  NULL
2      232912     Sure this is   2013-07-08 11:15  1
3      84291      Can we get     2013-07-08 11:16  NULL
4      300192     I listened to  2013-07-08 11:17  1

我想将它嵌套在评论和回复中:

ID
3
1
  2
  4

所以我想要实现的是在没有DateTime DESC的ReplyTo的情况下订购所有注释然后 对于每个评论显示日期时间升序的回复。

这在一个SQL查询中是否可行?

我尝试了这个,但它无可救药地错了

SELECT ID, UserID, CommentText, DateTime 
FROM Comment
LEFT JOIN Comment AS reply ON Comment.ID = Reply.ReplyTo
GROUP BY ID, UserID, CommentText, DateTime
HAVING ReplyTo IS NULL
ORDER BY DateTime Desc

我应该将其拆分为两个查询并执行UNION吗?或者我应该更改数据库的设计?

2 个答案:

答案 0 :(得分:2)

您可以使用递归CTE(公用表表达式) - 一种允许您通过层次结构下降的技术。

http://msdn.microsoft.com/EN-US/library/ms175972(v=VS.110,d=hv.2).aspx

......文章末尾的几个例子

答案 1 :(得分:0)

您应该能够利用row_number(),特别是order by子句,并执行以下操作:

select ReplyID, DateTime, replyto,
    row_number() over(order by DateTimedesc) AS OrderID
from reply
where replyto is null
union
select ReplyID, DateTime, replyto,
    row_number() over(order by DateTimeasc) AS OrderID
from reply
where replyto is not null