这可能已被问过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
吗?或者我应该更改数据库的设计?
答案 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