2012-11-04 56 views
7

我有以下查詢我要火:SQL查詢 - 結合DISTINCT和TOP?

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個很多條目。

我想是與最近的活動(在最新更新的條目職位)的get職位。

+0

您正在使用哪個數據庫管理系統? –

+0

的SQL Server 2008 R2(MSSQL) –

+0

還能有'Datemade'每'PostId'不止一個?如果是的話,哪一個用於訂購目的? –

回答

5

你可以找到每PostId最近Datemaderow_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_numbermax(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 
+0

非常感謝文本 - 它真的:-)幫助!謝謝。 –