我有两个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
答案 0 :(得分: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);
答案 1 :(得分: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);