0

Products が Pictures にマッピングされているテーブルがあります。写真付きの 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

結果:

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

現在、リクエストは各製品につき最大3枚の写真のみを許可することです. 製品の 4 番目、5 番目、n 番目のマッピングである行を削除するための DELETE ステートメントを作成するのは非常に難しいと思います。

これが可能かどうか、何か考えはありますか?

したがって、このデータを使用した削除後の結果は次のようになります。

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

ありがとう

4

2 に答える 2

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
于 2012-07-07T14:11:23.083 に答える
1

PictureId による ROW_NUMBER() パーティション分割と適切なフィールドによる順序付けを使用して、最初の 3 つのレコードを特定できます。

ここでは、順序を決定するために DisplayOrder フィールドを降順で使用していると仮定していることに注意してください。

SELECT *
FROM (
    SELECT  [Id]
          ,[ProductId]
          ,[PictureId]
          ,[DisplayOrder]
          , ROW_NUMBER() OVER (PARTITION BY ProductId ORDER BY DisplayOrder DESC) as PicNum
    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
                        )
) x
WHERE x.PicNum <= 3
ORDER BY ProductId, PicNum

写真が 3 つ以下のすべての製品を取得するために、別のクエリを実行していると思いますか? WHERE 句とサブクエリを削除するだけで、1 つのクエリですべてを実行できます。

SELECT *
FROM (
    SELECT  [Id]
          ,[ProductId]
          ,[PictureId]
          ,[DisplayOrder]
          , ROW_NUMBER() OVER (PARTITION BY ProductId ORDER BY DisplayOrder DESC) as PicNum
    FROM [LandOgFritid23].[dbo].[Product_Picture_Mapping]
) x
WHERE x.PicNum <= 3
ORDER BY ProductId, PicNum
于 2012-07-07T14:28:35.117 に答える