我有一个包含5列和查询要求的表:
update row no 8 (or id=8) set its column 2, column 3's value
from id 9th column 2, column 3 value.
意味着第2,3列的所有值都应该移到上一行的第2,3列(从第8行开始),最后一行的值2,3将为空
例如,只有3行,第一行不受影响,第二行到N-1 th 行移位一次,N th 行有空值
id math science sst hindi english
1 11 12 13 14 15
2 21 22 23 24 25
3 31 32 33 34 35
id = 2的查询结果应为:
id math science sst hindi english
1 11 12 13 14 15
2 31 32 23 24 25 //value of 3rd row (col 2,3) shifted to row 2
3 null null 33 34 35
此进程应针对id> gt的所有行运行2
请帮我创建此更新查询
我正在使用MS sqlserver 2005
答案 0 :(得分:2)
我认为你在寻找的东西就像......
UPDATE t1
SET
t1.math = t2.math,
t1.science = t2.science,
etc...
FROM
YourTable t1,
YourTable t2
WHERE
t1.id+1 = t2.id
注意WHERE是第一个实例表的ID +1等于第二个实例中的ID。因此,如果在表1 ID = 8,它将加入到第二个实例的ID = 9.最后,如果只有10个记录,10 + 1将没有匹配,从而导致NULL。
答案 1 :(得分:1)
怎么样:
-- @StartAt is the "first" (lowest Id) row to be updated
UPDATE MyTable
set
math = mt2.math
,science = mt2.sceience
from MyTable mt
left outer join MyTable mt2
on mt2.Id = mt.Id + 1
where mt.Id >= @StartAt
在您的示例中,将@StartAt设置为2.通过左外连接找到没有要连接的行,将“last”行设置为null。 (这假设找到了所有连续的行。如果你错过了一行,一组NULL将“潜入”并覆盖一些真实的数据...)
答案 2 :(得分:0)
您可以使用更新和加入来完成此操作。
UPDATE TempTable2
SET math=T2.Math,
science=T2.science,
sst=T2.sst,
hindi=T2.hindi,
english=T2.english
FROM TempTable2 T
LEFT JOIN
(SELECT id -1 as ID, math, science, sst, hindi, english
FROM temptable2 ) T2
ON T.ID=T2.Id
WHERE T.id>2