删除任何产品的3个图像以外的所有图像

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)

谢谢

Cha*_*ndu 5

使用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)