如何通过连接从组中选择顶行

时间:2017-10-21 14:25:23

标签: sql sql-server join

我有两个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

2 个答案:

答案 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);