2017-10-21 33 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