2016-09-16 62 views
9

Bu verilerin bir alt kümesidir ben:Güncelleme çoklu ikinci Kimliği en dizisinin ilk kimliklerini maç için

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

Ama ID2 ID1 her ayrı oluşum ilk geçtiği eşleşmesi gerekir, her Id2 değişiklikler gibi this:

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

Bunu binlerce satırda bir güncelleştirme deyimiyle nasıl değiştirebilirim?

Yardımlarınız için teşekkürler, bunun açıklanması zordu!

+0

neler DBMS kullanıyor musunuz? (SQL Server? MySQL? Oracle? Başka bir şey?) – Siyual

+0

Üzgünüm, etiketleri güncelledim, SQL server kullanıyorum. –

cevap

9

Sen FIRST_VALUE kullanımı ile CTE kullanabilirsiniz:

;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 

Eh, ne yazık ki FIRST_VALUE aşağıdaki sorguyu kullanabilirsiniz Bu durumda SQL Server 2008'de kullanılamaz:

;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

Bu, FIRST_VALUE kullanabileceğinden yeni SQL Server ile yeni geliştirme sunucusunda harika çalışıyor. Ne yazık ki alternatif çalışır, ancak değerleri güncellemez. –

+0

@Fizzgig Yayınlamadan önce test ettim. Aldığınız hatayı yeniden oluşturabilmek için bir test durumu ekleyebilir misiniz? –

+0

Hangi bilgilere ihtiyacınız var? (Üzgünüm, ben burada yeniyim) –