2017-10-21 75 views
0

我有兩個SQL表,新聞和newsSections。我想在選擇4種不同類型的新聞部分時顯示來自一個組的最高行。例如:如何從加入羣中選擇最上一行加入

SELECT TOP (4) a.newsID, a.title, a.clicked, a.path, a.newsDate, c.sectionName, a.sectionID 
FROM dbo.News a INNER JOIN 
    dbo.newsSection c 
    ON a.sectionID = c.SectionID 
WHERE (c.SectionID = 21) OR (c.SectionID = 23) OR (c.SectionID = 36) OR (c.SectionID = 37) 
GROUP BY c.sectionName, a.newsID, a.title, a.clicked, a.path, a.newsDate, a.sectionID 
ORDER BY a.newsDate DESC 
+1

示例數據和期望的結果可以更好地解釋你想要做什麼。我添加了SQL Server標記。 –

+1

當前查詢有什麼問題? – Parfait

+0

有一件事我不明白你的數據模型。你有新聞和新聞欄目。所以我希望這兩張表可以通過新聞ID相關聯。但令人驚訝的是你加入了sectionID。新聞怎麼能有sectionID?這不會使新聞成爲新聞欄目嗎?或者這是你的查詢中的一個簡單的錯字? –

回答

0

您可以使用APPLY

SELECT n.*, ns.sectionName 
FROM dbo.newsSection ns CROSS APPLY 
    (SELECT TOP 1 n.* 
     FROM dbo.News n 
     WHERE n.sectionID = ns.sectionID 
     ORDER BY n.newsDate DESC 
    ) n 
WHERE ns.SectionID IN (21, 23, 36, 37); 
+0

我試過了,但是得到了這個消息:消息156,級別15,狀態1,行8 關鍵字'ON'附近語法不正確。 – splitfire

+0

@splitfire。 。 。這是一個錯字。 'APPLY'沒有'ON'。 –

0

從查詢,你會從所有的新聞欄目的4篇最近的文章彙集在一起​​ - 這意味着,如果某些部分中的某些部分與其他部分有較近期的活動,則可能會從單個部分獲取多篇文章,而從另一部分獲取不到任何文章。

我猜你實際上想要的是每個部分的最新文章。如果是這樣,那麼Gordon Linoff的回覆就可以做到 - 除了他在查詢中的「ON」子句中留下。 (戈登自己指出了這一點。)應該看起來更像這樣:

SELECT n.*, ns.sectionName 
FROM dbo.newsSection ns CROSS APPLY 
    (SELECT TOP 1 n.* 
     FROM dbo.News n 
     WHERE n.sectionID = ns.sectionID 
     ORDER BY n.newsDate DESC 
    ) n 
WHERE ns.SectionID IN (21, 23, 36, 37); 
+0

我收到了同樣的錯誤。我正在使用SQL Server 2008.查詢看起來不錯,但仍然給我那個錯誤.. – splitfire