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

时间:2010-04-26 13:27:22

标签: 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 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

3 个答案:

答案 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