2010-12-13 4 views
0

Dans SQL Server 2008, j'ai table1 et j'aimerais mettre à jour la table comme indiqué dans la deuxième table. Par exemple, mettez à jour la valeur Value1 de Rn (2) = Value2 de Rn (1) à partir de l'enregistrement ci-dessus. La séquence est décidée par Rn. Toute aide à cet égard sera appréciée.Enregistrement de mise à jour T-SQL à partir d'un autre numéro de ligne

alt text

Merci beaucoup.

Create table Table1(ID int, value1 int, value2 int, Item varchar(10),Rn int) 

insert into Table1(ID,Value2,Item,Rn) values('1','33242','Orange','1') 
insert into Table1(ID,Value2,Item,Rn) values('2','67665','Orange','2') 
insert into Table1(ID,Value2,Item,Rn) values('3','78765','Orange','3') 
insert into Table1(ID,Value2,Item,Rn) values('4','576','Orange','4') 
insert into Table1(ID,Value2,Item,Rn) values('5','906658','Orange','5') 
insert into Table1(ID,Value2,Item,Rn) values('6','54435','Orange','6') 
insert into Table1(ID,Value2,Item,Rn) values('7','7464','Mango','1') 
insert into Table1(ID,Value2,Item,Rn) values('8','9876','Mango','2') 
insert into Table1(ID,Value2,Item,Rn) values('9','2433','Mango','3') 
insert into Table1(ID,Value2,Item,Rn) values('10','5654','Mango','4') 
insert into Table1(ID,Value2,Item,Rn) values('11','13213','Mango','5') 
insert into Table1(ID,Value2,Item,Rn) values('12','9867867','Mango','6') 
insert into Table1(ID,Value2,Item,Rn) values('13','5644355','Mango','7') 
insert into Table1(ID,Value2,Item,Rn) values('14','6534','Apple','1') 
insert into Table1(ID,Value2,Item,Rn) values('15','343','Apple','2') 
insert into Table1(ID,Value2,Item,Rn) values('16','423','Apple','3') 
insert into Table1(ID,Value2,Item,Rn) values('17','7666','Apple','4') 
+0

Appliquez-vous des relations n'importe où? Je vois une relation implicite parent enfant mais rien n'est réellement défini ... –

Répondre

2

Ceci définit la valeur1 de la première rangée de chaque "bloc" à null. Vous pouvez utiliser ISNULL pour surcharger ceci et en faire un 0, ou n'importe quelle autre valeur par défaut peut être appropriée.

;WITH cte (Id, Value1, Value2, Item, Rn, RnPlus1) 
as (select Id, Value1, Value2, Item, Rn, row_number() over (partition by Item order by Rn) + 1 RnPlus1 
from Table1) 
UPDATE Table1 
set Value1 = cte.Value2 
from Table1 t1 
    inner join cte 
    on cte.Item = t1.Item 
    and cte.RnPlus1 = t1.Rn 
+0

Merci monsieur! J'apprécie ton aide. – user219628

0

Cela peut être difficile puisque vous n'avez défini aucune relation parent-enfant. Pouvez-vous juste le faire au moment de l'insertion (et éventuellement définir la relation alors ...)?

insert into Table1(ID,Value1,Value2,Item,Rn) values('1','','33242','Orange','1') 
insert into Table1(ID,Value1,Value2,Item,Rn) values('2','33242','67665','Orange','2') 
insert into Table1(ID,Value1,Value2,Item,Rn) values('3','67665','78765','Orange','3') 
insert into Table1(ID,Value1,Value2,Item,Rn) values('4','78765','576','Orange','4') 

et ainsi de suite ...

+0

Merci. Mettre à jour la valeur Value1 de Rn (2) = Value2 de Rn (1) à partir de l'enregistrement ci-dessus. La séquence est décidée par Rn. – user219628

0

J'ai toujours trouvé que ce une douleur dans le cul droit. Mais je suggérerais un curseur. Quelque chose comme ça; (Ceci est juste le squelette. Il ne fonctionne pas! Mais vous devriez être en mesure de voir le principe)

DECLARE @ entier field1 DECLARE @ entier fiedl2 DECLARE entier @NewValue

SET @NewValue = 0

DECLARE Tab1 CURSEUR POUR SELECT * FROM Table1

FETCH NEXT Tab1 EN @ field1, @ field2

ALORS QUE @@ FETCH_STATUS = 0 BEGIN

IF @NewValue <> 0 
    UPDATE Table1 SET field1 = @NewValue 

FETCH NEXT FROM Tab1 
INTO @field1, @field2 

SET @NewValue = @field2 

FIN

FERMER Tab1 DEALLOCATE Tab1

0

Du haut de ma tête, quelque chose comme:

mise à jour table1 t1 set t1. value1 = (sélectionnez t2.value2 depuis la table1 t2 où t2.id = t1.id + 1) où t1.rn! = 1

Questions connexes