获取出版物类别时的重复行

时间:2018-04-12 11:20:08

标签: sql-server join

我有一份出版物

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个出版物及其类别而不是获得重复行的更好方法(因为重复的行,我有重复的出版物)

3 个答案:

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