一尘不染

TSQL左连接,右上仅最后一行

sql

我正在编写sql查询以获取帖子,并且仅发布该帖子的最后评论(如果存在)。但是我找不到一种方法来限制左连接中的右列仅限制一行。

这是此查询的示例。

SELECT post.id, post.title,comment.id,comment.message
from post
left outer join comment
on post.id=comment.post_id

如果帖子有3条评论,则此帖子可获得3行,但我只希望有1条带有最后评论(按日期排序)。

有人可以帮我这个查询吗?


阅读 152

收藏
2021-03-17

共1个答案

一尘不染

SELECT  post.id, post.title, comment.id, comment.message
FROM    post
OUTER APPLY
        (
        SELECT  TOP 1 *
        FROM    comment 褋
        WHERE   c.post_id = post.id
        ORDER BY
                date DESC
        ) comment

或者

SELECT  *
FROM    (
        SELECT  post.id, post.title, comment.id, comment.message,
                ROW_NUMBER() OVER (PARTITION BY post.id ORDER BY comment.date DESC) AS rn
        FROM    post
        LEFT JOIN
                comment
        ON      comment.post_id = post.id
        ) q
WHERE   rn = 1

前者对于很少的帖子,每个帖子中都有很多评论,效率更高;对于许多帖子,每个帖子中都很少有评论,后者的效率更高。

2021-03-17