2016-09-16 7 views
9

の最初のIDを一致させるためにこれは私が持っているデータのサブセットです:更新複数の第2のIDのシリーズ

|Id1|Id2| 
--------- 
|100| 90| 
|101| 90| 
|102| 90| 
|217|101| 
|218|101| 
|219|101| 

しかし、Id2とが変化するたびにID2が同様に、Id1をそれぞれ別々の発生の最初の出現と一致する必要がありますこれは:

|Id1|Id2| 
--------- 
|100|100| 
|101|100| 
|102|100| 
|217|217| 
|218|217| 
|219|217| 

これを変更するには、更新ステートメントを使用します。

ご協力ありがとうございます、これは説明するのが難しいです!あなたがFIRST_VALUEの使用にCTEを使用することができます

+0

何DBMSを使用していますか? (SQL Server?MySQL?Oracle?その他) – Siyual

+0

申し訳ありません、タグを更新しました。私はSQLサーバーを使用しています。 –

答えて

9

;WITH ToUpdate AS (
    SELECT Id1, Id2, 
      FIRST_VALUE(Id1) OVER (PARTITION BY Id2 ORDER BY Id1) AS newValue 
    FROM mytable 
) 
UPDATE ToUpdate 
SET Id2 = newValue 

まあ、残念ながらFIRST_VALUEあなたは次のクエリを使用することができます。この場合、SQL Server 2008で使用できません。

;WITH CTE_Rn AS (
    SELECT Id1, Id2, 
      ROW_NUMBER() OVER (PARTITION BY Id2 ORDER BY Id1) AS rn 
    FROM mytable 
), ToUpdate AS (
    SELECT t1.Id1, t2.Id2, t2.Id1 AS newValue 
    FROM mytable AS t1 
    JOIN CTE_Rn AS t2 ON t1.Id2 = t2.Id2 AND t2.rn = 1 
) 
UPDATE ToUpdate 
SET Id2 = newValue 
+0

これは、FIRST_VALUEを使用できる新しいSQL Serverを備えた新しい開発サーバーでうまく機能します。 残念ながら、代わりに実行されますが、値は更新されません。 –

+0

@Fizzgig投稿する前にテストしました。あなたが得たエラーを再現できるように、テストケースを追加できますか? –

+0

どのような情報が必要ですか? (申し訳ありません、私はここにいます) –

関連する問題