SQL Server TSQL左连接和仅右起最后一行

omhiaaxx  于 2022-12-22  发布在  其他
关注(0)|答案(6)|浏览(179)

我正在写sql查询来获取帖子和这个帖子的最后一条评论(如果存在的话)。但是我找不到一种方法来限制左连接中右列只有1行。
以下是此查询的示例。

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

如果帖子有3个评论,我得到3行与此职位,但我只想与最后一个评论(按日期排序)1行。
有人能帮我查询一下吗?

t9eec4r0

t9eec4r01#

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

前者对于每个帖子中有许多评论的帖子更有效;后者对于许多每个帖子几乎没有评论的帖子来说效率更高。

9rnv2umw

9rnv2umw2#

子查询:

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(c2.id) FROM comment c2 WHERE c2.post_id = p.id)
yh2wf1be

yh2wf1be3#

您可能希望联接到返回帖子最后一条评论的子查询。例如:

select post.id, post.title. lastpostid, lastcommentmessage
from post
inner join
(
    select post.id as lastpostid, max(comment.id) as lastcommentmessage
    from post
    inner join comment on commment.post_id = post.id
    group by post.id
) lastcomment
    on lastpostid = post.id
8yoxcaq7

8yoxcaq74#

有几个选择...
一种方法是在以下对象上执行JOIN:

SELECT TOP 1 comment.message FROM comment ORDER BY comment.id DESC

(note我假设comment.id是一个身份字段)

vfh0ocws

vfh0ocws5#

什么版本的SQL Server?如果你有Row_Number()函数,你可以根据“first”对你来说意味着什么来对你的评论进行排序,然后添加一个“where RN=1”子句。我的脑海中没有一个方便的例子或正确的语法,但确实有大量的查询可以做到这一点。其他帖子都有1,000种你可以做到这一点的方法。
我会说侧写它,看看哪一个最适合你。

voj3qocg

voj3qocg6#

您没有说出日期字段的具体名称,所以我用[DateCreated]填充,这与上面的AgoodDisplayName的帖子基本相同,但使用日期字段而不是依赖ID列排序。

SELECT post.id, post.title, comment.id, comment.message
FROM post p
LEFT OUTER JOIN comment
ON comment.id = (
    SELECT TOP 1 id
    FROM comment
    WHERE p.id = post_id
    ORDER BY [DateCreated] ASC
)

相关问题