TSQL离开了连接,只有右边的最后一行

bar*_*ian 31 sql t-sql sql-server left-join

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

以下是此查询的示例.

SELECT post.id, post.title,comment.id,comment.message
from post
left outer join comment
on post.id=comment.post_id
Run Code Online (Sandbox Code Playgroud)

如果帖子有3条评论,我会在这篇文章中获得3行,但我想只有1行和最后一条评论(按日期排序).

有人可以帮我解决这个问题吗?

Qua*_*noi 52

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
Run Code Online (Sandbox Code Playgroud)

要么

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
Run Code Online (Sandbox Code Playgroud)

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


AGo*_*ame 15

子查询:

SELECT p.id, p.title, c.id, c.message
FROM post p
LEFT join comment c
ON c.post_id = p.id AND c.id = 
                 (SELECT MAX(c.id) FROM comment c2 WHERE c2.post_id = p.id)
Run Code Online (Sandbox Code Playgroud)