基于同一表中的多个列和记录创建SQL更新查询

基于同一表中的多个列和记录创建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

我得到了一个包含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 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()排序函数,但这完全取决于您如何确定数据的顺序。