您可以使用 CTE(通用表表达式)和ROW_NUMBER()
函数尝试这样的事情:
;WITH CTE AS
(
SELECT
m.MessageId, m.MessageText, m.PostedDate,
CommentDate = ISNULL(c.CommentDate, '19000101'),
RowNum = ROW_NUMBER() OVER (PARTITION BY m.MessageID
ORDER BY ISNULL(c.CommentDate, '19000101') DESC)
FROM dbo.Messages m
LEFT OUTER JOIN dbo.Comments c ON c.MessageId = m.MessageId
)
SELECT
MessageId, MessageText, PostedDate
FROM
CTE
WHERE
RowNum = 1
ORDER BY
CommentDate DESC
此 CTE 按 对数据“分区” MessageID
,然后按其对所有评论(如果有)进行编号CommentDate
。因此,对于每个MessageID
,您都应该获得连续RowNum
的值 - 从 1 开始最近的评论。
从此 CTE(“临时”内嵌视图)中,您只需选择所有具有RowNum = 1
最新评论日期的行。我也在选择CommentDate
CTE 内部,因为我认为可能还没有评论,所以我使用该ISNULL()
功能确保在没有评论存在的情况下提供虚构的评论日期。