1

この状態を解決するには助けが必要です。レコードを含むテーブルがあり、フィールド sku があります。このレコードには、sku が複数回表示されています。テーブル構造はこのrid | id | sku | nameのようなものです

SKU がテーブルで複数回使用可能な場合、レコードは次のようになります

rid  id  sku     name
---  --  ------  --------------

1    3   rs-123  test product

2    3   rs-123  test product

3    4   rs-125  test product 2

4    4   rs-125  test product 2

5    4   rs-125  test product 2

6    6   rs-126  test product 3

必要なのは、最初のレコードを変更せずに重複レコードでテーブルを更新することです (N-1)。たとえば、重複レコードのみを更新する SQL ステートメントを実行する必要があるため、最初のレコードが更新されると、次のようになります。

rid  id  sku     name
---  --  ------  --------------
1    3   rs-123  test product
2    3   updated  updated 

この SQL ステートメントで何かを達成しようとしていましたが、機能していません

WITH duplicates AS (
  SELECT
ROW_NUMBER() OVER (PARTITION BY id ORDER BY rid) AS duplicate_id,
*
FROM
test
)

UPDATE
  duplicates
SET
  sku = updated
WHERE
  duplicate_id > 1

どんなアドバイスでも大歓迎です。

4

3 に答える 3

1

おそらく、変数を使って試してみてください:

SQLFIDDLE デモ

set @sku:='';

select a.rid, a.id, 
@sku:= (case when @sku<>a.sku
        then a.sku else 'updated'
        end) as skus, @sku:=a.sku, a.name
from skus a
;

| RID | ID |    SKUS | @SKU:=A.SKU |           NAME |
-----------------------------------------------------
|   1 |  3 |  rs-123 |      rs-123 |   test product |
|   2 |  3 | updated |      rs-123 |   test product |
|   3 |  4 |  rs-125 |      rs-125 | test product 2 |
|   4 |  4 | updated |      rs-125 | test product 2 |
|   5 |  4 | updated |      rs-125 | test product 2 |
|   6 |  6 |  rs-126 |      rs-126 | test product 3 |

更新の場合:

更新用の SQLFIDDLE デモ

set @sku:='';

UPDATE
  skus a
  join 
  (select a.rid, a.id, 
@sku:= (case when @sku<>a.sku
        then a.sku else 'updated'
        end) as skus, @sku:=a.sku, a.name
from skus a) b
  on a.rid = b.rid
SET
  a.sku = 'up_again'
WHERE
  b.skus = 'updated'
;

| RID | ID |      SKU |           NAME |
----------------------------------------
|   1 |  3 |   rs-123 |   test product |
|   2 |  3 | up_again |   test product |
|   3 |  4 |   rs-125 | test product 2 |
|   4 |  4 | up_again | test product 2 |
|   5 |  4 | up_again | test product 2 |
|   6 |  6 |   rs-126 | test product 3 |

を使用した別の例を次に示しますJoins

http://sqlfiddle.com/#!2/ddf47/2

update skus a
join skus b
on a.rid = b.rid +1
set a.sku = 'updated'
where a.sku = b.sku
;


| RID | ID |     SKU |           NAME |
---------------------------------------
|   1 |  3 |  rs-123 |   test product |
|   2 |  3 | updated |   test product |
|   3 |  4 |  rs-125 | test product 2 |
|   4 |  4 | updated | test product 2 |
|   5 |  4 | updated | test product 2 |
|   6 |  6 |  rs-126 | test product 3 |

SKU と名前の両方を更新するには:

http://sqlfiddle.com/#!2/97f4f/1

update skus a
join skus b
on a.rid = b.rid +1
set a.sku = 'updated', a.name = 'new_name'
where a.sku = b.sku
;

| RID | ID |     SKU |           NAME |
---------------------------------------
|   1 |  3 |  rs-123 |   test product |
|   2 |  3 | updated |       new_name |
|   3 |  4 |  rs-125 | test product 2 |
|   4 |  4 | updated |       new_name |
|   5 |  4 | updated |       new_name |
|   6 |  6 |  rs-126 | test product 3 |

SQL SERVERでROW_NUMBER()を使用したOPの質問を見る

http://sqlfiddle.com/#!3/355c4/2

update a 
set a.sku = 'updated', a.name = 'new_name'
from skus a
join (Select rid, id, row_number() over (
  partition by id order by rid asc) rank
from skus) b
on a.rid = b.rid
where b.rank > 1
;

| RID | ID |     SKU |           NAME |
---------------------------------------
|   1 |  3 |  rs-123 |   test product |
|   2 |  3 | updated |       new_name |
|   3 |  4 |  rs-125 | test product 2 |
|   4 |  4 | updated |       new_name |
|   5 |  4 | updated |       new_name |
|   6 |  6 |  rs-126 | test product 3 |
于 2013-01-27T11:02:04.507 に答える
0

これを試して:

UPDATE
  test
SET
  sku = 'updatedSKU'
WHERE rid IN
(
  SELECT
    rid
  FROM
  (
    SELECT rid,
        @rn := IF(@sku != sku, 1, @rn + 1) rn,
        @sku:=sku
     FROM test,
        (SELECT @rn:=0, @sku := NULL) r
  ) s
  WHERE rn > 1
);

SQL FIDDLE DEMO

またはこれ:

UPDATE
   test t
   JOIN
     (
       SELECT rid,
           CASE WHEN @sku != sku THEN @rn := 1 ELSE @rn := @rn + 1 END rn,
           @sku:=sku
        FROM test,
          (SELECT @rn:=0, @sku := NULL) r
     ) s
  ON t.rid = s.rid
  SET  sku = 'updatedSKU'
  WHERE s.rn > 1;

SQL FIDDLE DEMO

于 2013-01-27T11:17:20.327 に答える
0

ridが一意であると仮定すると、このバージョンはデータの順序に依存せずに機能します。

update skus, (
       select id, min(rid) rid from skus group by id 
) minimum_rid
set skus.sku = 'updated'
, skus.name = 'updated'
where skus.id = minimum_rid.id
and skus.rid > minimum_rid.rid ;
于 2013-01-27T11:37:28.670 に答える