2010-01-11 6 views
0

j'utilise SQL Server 2008.Comment mettre à jour récursive groupes dans SQL Server

suivant Datapool:

PK Col1  Col2 
1 SomeValue1 DataToTake1 
2 SomeValue1 
3 SomeValue1 
4 SomeValue1 
5 SomeValue2 DataToTake2 
6 SomeValue2 
... 

je veux insérer DataToTake1 dans Col2 des dossiers avec PK 2, 3 et 4 et DataToTake2 pour
pour le rendre plus évidentune autre info: PK peut ne pas être incrémentale ni séquencée sur le système productif (mais comme nous pouvons grouper par Col1, j'espère que ce ne sera peut-être pas un problème).

est-il un moyen d'y parvenir avec sql Server? (Un compagnon mis en œuvre cela avec un pointeur ... arggggh)

modifier
merci pour vos réponses, mais je dois revoir ma demande, que ma situation initiale a changé: je dois prendre PK en compte. par exemple.

PK Col1  Col2 
1 SomeValue1 DataToTake1 
2 SomeValue1 
4 SomeValue1 
5 SomeValue2 DataToTake2 
6 SomeValue2 
9 SomeValue1 

Comment mettre à jour uniquement les lignes séquencées? avec cet exemple, PK 1 = 2 = 4

Répondre

1

Je pense que vous devrez utiliser des tables temporaires:

create table #DataToTake ( seq int identité non nulle (1, 1) , PK_S int non null, - affecte le même type que PK dans dataPool PK_E int null, - définit le même type que PK dans dataPool Col1 varchar (20) null, - affecte le même type que Col1 dans dataPool Col2 varchar (20) null - définit le même type que Col2 dans dataPool )

insert dans #DataToTake (PK_S, Col1, Col2) select PK, Col1, Col2 de Datapool où Col2 est non nulle commande par PK

mise à jour #DataToTake défini PK_E = dtt2 .PK_S de #DataToTake jointure interne #DataToTake dtt2 sur # DataToTake.seq = dtt2.seq - 1

mise à jour #DataToTake mis PK_E = (select max (PK) + 1 de Datapool) où PK_S = (Max sélectionner (PK_S) à partir de #DataToTake)

mise à jour Datapool défini Col2 = dtt.Col2 de Datapool jointure interne #DataToTake DTT sur dataPool.PK> dtt.PK_S et dataPool.PK < dtt.PK_E et dataPool.Col1 = dtt.Col1

drop table #DataToTake

1
-- Select the top 1 value which has data, and matches whats in Col1 
UPDATE dataPool 
SET Col2 = (SELECT TOP 1 t3.Col2 
      FROM dataPool t3 
      WHERE t3.col1 = t2.col1 
      AND t3.Col2 IS NOT NULL) -- 
FROM dataPool t2 
WHERE t2.Col1 = Col1 
AND col2 IS NULL -- Only update Rows with NULLs in 
+0

vous remercie de solution, mais ma demande a changé. pourriez-vous m'aider? –

2
UPDATE 
    D1 
SET 
    Col2 = D2.Col1 
FROM 
    dataPool D1 
    JOIN 
    dataPool D2 ON D1.col1 = D2.col1 
WHERE 
    D1.col2 <> D2.col2 OR D1.col2 IS NULL 
+0

merci pour la solution, mais ma demande a changé. pourriez-vous m'aider? –

+0

Cela change radicalement le code. Je verrai si j'ai le temps plus tard: désolé je ne peux rien faire maintenant – gbn

+0

pas de problème! J'apprécie n'importe quelle aide à un moment donné! –

Questions connexes