8

我有以下要触发的查询:

SELECT DISTINCT TOP(5) fp.PostId FROM dbForumPosts fp
LEFT JOIN dbForumEntry fe ON fp.PostId = fe.PostId
Order by fe.Datemade DESC

但是,当我触发它时,我得到了错误:

Msg 145, Level 15, State 1, Line 1
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

我试图更改查询,所以它改用 GROUP BY,但后来我遇到了以下问题:

Msg 8127, Level 16, State 1, Line 4
Column "dbForumEntry.Datemade" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.

我想要什么:

把它想象成一个论坛。有帖子 (dbForumPosts) 和条目 (dbForumEntry)。公关帖子有 0 多个条目。

我想要的是获取具有最新活动的帖子(包含最新更新条目的帖子)。

4

1 回答 1

6

您可以Datemade使用PostId. row_number然后您可以搜索最近的 5 个帖子:

select  top 5 PostId
from    (
        select  PostId
        ,       Datemade
        ,       row_number() over (partition by PostId
                    order by Datemade) as rn
        from    dbForumEntry
        ) SubQueryAlias
where   rn = 1 -- Most recent row per PostId
order by
        Datemade desc

或者,您可以使用group by子查询实现相同的目的:

select  top 5 PostId
from    (
        select  PostId
        ,       max(Datemade) as LastDate
        from    dbForumEntry
        group by
                PostId
        ) SubQueryAlias
order by
        LastDate desc

如果dbForumEntry有一个 ID 列(比如ForumEntryId),这样的查询可能会执行得更好。数据库可以在不编译整个表的row_number情况下运行它。max(Datemade)

select  top 5 PostId
from    dbForumPosts fp
where   not exists -- No later entry for the same post exists
        (
        select  *
        from    dbForumPosts fp2
        where   fp2.PostId = fp.PostId
                and fp2.ForumEntryId > fp.ForumEntryId
        )
order by
        Datemade desc
于 2012-11-04T14:59:09.590 回答