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

时间:2010-02-17 14:44:49

标签: sql sql-server tsql 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

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

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

6 个答案:

答案 0 :(得分:51)

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

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

答案 1 :(得分:14)

子查询:

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)

答案 2 :(得分:3)

您需要加入一个返回帖子最后评论的子查询。例如:

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

答案 3 :(得分:1)

几个选项......

一种方法是在JOIN上进行:

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

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

答案 4 :(得分:1)

什么版本的SQL Server?如果您有Row_Number()函数可用,您可以按照“第一”的方式对您的注释进行排序,然后只需添加“where RN = 1”子句。没有一个方便的示例或正确的语法,但确实有大量的查询正是这样做的。其他帖子都是以1,000种方式完成的。

我会说出来,看看哪一个最适合你。

答案 5 :(得分:0)

您没有说出日期字段的具体名称,因此我填写了[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
)