Cri*_*riu 0 sql sql-server-2008
我有一个表格,产品与图片一起映射.有些产品有1到n个图片映射.为了很好地查看映射,我构建了一个SQL,因此我可以按ProductId查看它们.
SELECT [Id]
,[ProductId]
,[PictureId]
,[DisplayOrder]
FROM [LandOgFritid23].[dbo].[Product_Picture_Mapping]
Where ProductId in (select ProductId
FROM [LandOgFritid23].[dbo].Product p,
[LandOgFritid23].[dbo].[Product_Picture_Mapping] pm
where p.Id = pm.ProductId
group by ProductId
having COUNT(pm.PictureId) > 3
)
order by ProductId
Run Code Online (Sandbox Code Playgroud)
结果:
Id ProductId PictureId DisplayOrder
2085 103 2388 2
2185 103 2488 1
7132 103 7468 1
7133 103 7469 1
2158 107 2461 0
320 107 415 1
3485 107 3816 1
3486 107 3817 1
3529 107 3860 1
Run Code Online (Sandbox Code Playgroud)
现在,请求是每个产品只允许3张图片MAX.我发现很难创建DELETE语句来删除任何行,即第4,第5,第n个产品映射.
如果可能,你有任何想法吗?
所以删除后的结果,这个数据将是:
Id ProductId PictureId DisplayOrder
2085 103 2388 2
2185 103 2488 1
7132 103 7468 1
2158 107 2461 0
320 107 415 1
3485 107 3816 1
Run Code Online (Sandbox Code Playgroud)
谢谢
使用CTE:
注意:假设您要保留最新的3张图片
WITH Data AS
(
SELECT *,
ROW_NUMBER()
OVER(PARTITION BY ProductId ORDER BY PictureId DESC)
AS Position
FROM [LandOgFritid23].[dbo].[Product_Picture_Mapping]
)
DELETE
FROM Data
WHERE Position > 3
Run Code Online (Sandbox Code Playgroud)