我有桌子:
Category: Id, Name...
News: Id, Title
News_Category_Mapping: Id, NewsId, CategoryId
其中newsid,categoryid是这两个表的外键。
News_category_mapping:
Id NewsID CategoryId
1 1 1
2 2 1
3 3 1
4 4 3
5 5 5
6 6 3
所以我可能希望从每个categoryid获得最多2个新闻项,比如说
Id NewsID CategoryId
1 1 1
2 2 1
4 5 3
6 6 3
5 5 5
抱歉我的英文。
答案 0 :(得分:1)
试试这个:
WITH CTE AS
(SELECT C.Id,N.Id,N.Title,RN=ROW_NUMBER() OVER (PARTITION BY NC.CategoryID ORDER BY NC.NewsId)
FROM News_Category_Mapping NC JOIN
News N ON NC.NewsId=N.Id JOIN
Category C ON NC.CategoryId=C.Id)
SELECT * FROM CTE WHERE RN<3
<强>解释强>
这里,内部查询沿行号RN选择记录。要了解查询的工作原理,请先执行内部查询。
答案 1 :(得分:1)
假设您需要每件物品
Select *
From Category C
CROSS APPLY (Select top 2 Id,CatId,NewsName
From News Nw where Nw.CatId=C.Id) As N
答案 2 :(得分:0)
您可以使用CROSS APPLY,如下所示:
Select c.*, Sub.*
from
Categories c cross apply
(
select top 2
*
from
News n
where
exists
(
select 1
from NewsCategories nc
where nc.CatId = c.id and n.id = nc.NewsId
)
) Sub
这是
的SQLFiddle