Tsql 来自其他行号的T-SQL更新记录

Tsql 来自其他行号的T-SQL更新记录,tsql,Tsql,在SQLServer2008中,我有表1,希望更新表,如第二个表所示。 i、 e.从上述记录中更新Rn2的值1=Rn1的值2。顺序由Rn决定。 在此方面的任何帮助都将不胜感激 非常感谢 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 i

在SQLServer2008中,我有表1,希望更新表,如第二个表所示。 i、 e.从上述记录中更新Rn2的值1=Rn1的值2。顺序由Rn决定。 在此方面的任何帮助都将不胜感激

非常感谢

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')

可能很难,因为您尚未定义任何父子关系。你能不能在插入时就这样做,然后可能定义关系

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')

等等……

我总是觉得这是一种很痛苦的感觉。但我建议使用光标。像这样的东西;这只是骨架。它不起作用!但你应该能看到原理

声明@field1整数 声明@fiedl2整数 声明@NewValue整数

设置@NewValue=0

将Tab1游标声明为 从表1中选择*

从Tab1中获取下一个 进入@field1、@field2

而@@FETCH\u STATUS=0 开始

结束

关闭选项卡1
从我的头顶上取消分配Tab1,类似于:


更新表1 t1设置t1.value1=从表1 t2中选择t2.value2,其中t2.id=t1.id+1,其中t1.rn!=1

这将每个块的第一行的值1设置为空。您可以使用ISNULL来覆盖它,并将其设置为0,或者其他任何合适的默认值

;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

你在任何地方强制执行任何关系吗?我看到一个隐含的亲子关系,但实际上没有什么定义…谢谢。更新Rn2的更新值1=上述记录中Rn1的更新值2。顺序由Rn决定。谢谢你,先生!我感谢你的帮助。
;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