如何从加入群中选择最上一行加入
我有两个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
您可以使用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);
我试过了,但是得到了这个消息:消息156,级别15,状态1,行8 关键字'ON'附近语法不正确。 – splitfire
@splitfire。 。 。这是一个错字。 'APPLY'没有'ON'。 –
从查询,你会从所有的新闻栏目的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);
我收到了同样的错误。我正在使用SQL Server 2008.查询看起来不错,但仍然给我那个错误.. – splitfire
示例数据和期望的结果可以更好地解释你想要做什么。我添加了SQL Server标记。 –
当前查询有什么问题? – Parfait
有一件事我不明白你的数据模型。你有新闻和新闻栏目。所以我希望这两张表可以通过新闻ID相关联。但令人惊讶的是你加入了sectionID。新闻怎么能有sectionID?这不会使新闻成为新闻栏目吗?或者这是你的查询中的一个简单的错字? –