基于同一表中的多个列和记录创建SQL更新查询
我得到了一个包含5列和查询要求的表:基于同一表中的多个列和记录创建SQL更新查询,sql,sql-server,sql-server-2005,sql-update,Sql,Sql Server,Sql Server 2005,Sql Update,我得到了一个包含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行移动一次,第N行为空 id math science sst hindi engl
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行移动一次,第N行为空
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>2的所有行运行
请帮助我创建此更新查询
我使用的是MSSQLServer2005我想你要找的是
UPDATE t1
SET
t1.math = t2.math,
t1.science = t2.science,
etc...
FROM
YourTable t1,
YourTable t2
WHERE
t1.id+1 = t2.id
请注意,第一个实例表的ID+1的位置等于第二个实例中的ID。所以,如果表1id=8,它将连接到第二个实例的ID=9。最后,如果只有10条记录,那么10+1将没有匹配项,从而导致空值。我认为您要查找的是
UPDATE t1
SET
t1.math = t2.math,
t1.science = t2.science,
etc...
FROM
YourTable t1,
YourTable t2
WHERE
t1.id+1 = t2.id
请注意,第一个实例表的ID+1的位置等于第二个实例中的ID。所以,如果表1id=8,它将连接到第二个实例的ID=9。最后,如果只有10条记录,10+1将没有匹配项,从而导致NULL。如何:
-- @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。(这假定找到了所有连续的行。如果缺少一行,一组空值将“潜入”并覆盖一些实际数据…如何:
-- @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。(这假定找到了所有连续的行。如果缺少一行,一组空值将“潜入”并覆盖一些实际数据…您可以通过更新和联接来实现这一点
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
您可以通过更新和连接来实现这一点
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
您使用的是什么类型的数据库(MySQL、SQL Server、Oracle等)?@Peter:Rajesh的绰号为“.Net Developer”,我猜他使用的是MS SQL Server。您使用的是什么类型的数据库(MySQL、SQL Server、Oracle等)?@Peter:Rajesh的绰号为“.Net Developer”,我猜他使用的是MS SQL Server.gr8,多亏了它按我所希望的那样工作,只有一个不起作用,即最后一行的值未在其值被移到上一行的列中获取null值。然后,我将添加第二个更新命令,将所有非ID列设置为null,其中t1.ID=select max(t2.ID)从您的表t2gr8中,非常感谢它按我所希望的方式工作,只有一个不起作用,即最后一行not在其值被移到上一行的列中获取null值。然后,我将添加第二个update命令,将所有非ID列设置为null,其中t1.ID=select max(t2.ID)从您的表t2中,请告诉我,如果我的ID列的数据类型是uniqueidentifier,它会起作用吗?在什么情况下,我必须做什么?首先,您应该在问题中说明它必须与uniqueidentifier而不是整数起作用。其次,因为您的更新完全依赖于数据的精确排序(第一个替换为第二个,第二个替换为第三个,等等),您需要识别该顺序,并以某种方式将其放入join子句(mt.YourId=mt2.YourId+1)排名函数,但它完全取决于您如何确定数据的顺序。请告诉我,如果我的ID列的数据类型是uniqueidentifier,它会起作用吗?在什么情况下,我必须做什么?首先,您应该在问题中说明它必须与uniqueidentifier而不是整数起作用。其次,因为您的更新完全依赖于t当数据被精确排序(第一个替换为第二个,第二个替换为第三个,等等)时,您需要确定该排序,并以某种方式将其放入join子句(mt.YourId=mt2.YourId+1)中。我将研究row_number()排序函数,但这完全取决于您如何确定数据的顺序。