2016-09-16 7 views
9

इस डेटा के एक उपसमूह है मेरे पास है:अद्यतन कई दूसरी ईद के पहले ईद एक श्रृंखला के मैच के लिए

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

लेकिन आईडी 2 ID1 से प्रत्येक अलग घटना की पहली घटना से मेल खाना चाहिए, जब भी आईडी 2 परिवर्तन, जैसे यह:

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

मैं अद्यतन विवरण के साथ हजारों पंक्तियों में इसे कैसे बदल सकता हूं?

आपकी मदद के लिए धन्यवाद, यह समझाना मुश्किल था!

+0

क्या क्या आप डीबीएमएस का उपयोग कर रहे हैं? (एसक्यूएल सर्वर? MySQL? ओरेकल? कुछ और?) – Siyual

+0

क्षमा करें, बस टैग अपडेट किया गया है, मैं SQL सर्वर का उपयोग कर रहा हूँ। –

उत्तर

9

आप FIRST_VALUE के उपयोग के साथ CTE उपयोग कर सकते हैं:

;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 नहीं एसक्यूएल सर्वर 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

यह नए SQL सर्वर के साथ नए विकास सर्वर पर बहुत अच्छा काम करता है क्योंकि मैं FIRST_VALUE का उपयोग कर सकता हूं। दुर्भाग्य से वैकल्पिक रन चलता है, लेकिन मानों को अपडेट नहीं करता है। –

+0

@Fizzgig मैंने पोस्ट करने से पहले इसका परीक्षण किया है। क्या आप एक टेस्ट केस जोड़ सकते हैं ताकि मैं आपको मिली त्रुटि को पुन: पेश कर सकूं? –

+0

आपको किस जानकारी की आवश्यकता है? (क्षमा करें, मैं यहाँ नया हूं) –

संबंधित मुद्दे