我有一份出版物
表Id | Title | Content ...
1 | 'Ex title 1' | 'example content 1'
2 | 'Ex title 2' | 'example content 2'
...
和类别表
CategoryId | PublicationId
1 | 1
2 | 1
2 | 2
3 | 2
...
因此,出版物可以有一个或多个类别。
我试图在一个查询中获取前10个出版物及其类别,如:
SELECT [Publication].Id, [Publication].Title, [Publication].Content, [PublicationCategory].CategoryId
FROM [Publication]
LEFT JOIN [PublicationCategory] ON [Publication].Id = [PublicationCategory].Id
ORDER BY [Publication].Id DESC
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
但是由于不同的类别ID,我得到重复的值,这是获得10个出版物及其类别而不是获得重复行的更好方法(因为重复的行,我有重复的出版物)
答案 0 :(得分:2)
您可以先选择TOP 10
出版物,然后将JOIN
与“类别”表放在一起,如下面的查询,以获取所有类别。
SELECT [Publication].*,[PublicationCategory].[categoryid]
FROM
(
SELECT TOP 10 [Publication].id,
[Publication].title,
[Publication].content
FROM Publications [Publication]
ORDER BY [Publication].Id DESC
) [Publication]
INNER JOIN Categories [PublicationCategory]
ON [Publication].id = [PublicationCategory].publicationid
<强> DEMO 强>
答案 1 :(得分:0)
使用CTE为您的公开信息编号,然后将JOIN
编号到您的表格PublicationCategory
上并过滤ROW_NUMBER()
的值:
WITH RNs AS(
SELECT P.Id, P.Title, P.Content,
ROW_NUMBER() OVER (ORDER BY P.ID DESC) AS RN
FROM Publication P)
SELECT RNs.Id, Rns.Title, RNs.Content,
PC.CategoryId
FROM RNs
LEFT JOIN PublicationCategory PC ON RNs.Id = PC.Id
WHERE RNs.RN <= 10;
答案 2 :(得分:0)
我认为最好的答案是@ PSK,但如果出版物没有被分类怎么办? (奇怪的情况,但如果没有验证可能会发生)所以你可以添加一个左连接,并始终至少获得10个出版物,如果出版物没有类别,你仍然会得到它,但有一个NULL类
SELECT [Publication].*,[PublicationCategory].[categoryid]
FROM
(
SELECT TOP 10 [Publication].id,
[Publication].title,
[Publication].content
FROM Publications [Publication]
ORDER BY [Publication].Id DESC
) [Publication]
LEFT JOIN Categories [PublicationCategory]
ON [Publication].id = [PublicationCategory].publicationid