【问题标题】:Creating a SQL update query based on multiple columns and records in same table基于同一表中的多个列和记录创建 SQL 更新查询
【发布时间】:2010-04-26 13:27:21
【问题描述】:

我有一个包含 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-1th 行移动一次,第 Nth 行有空值.

 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 的行运行

请帮我创建这个更新查询

我正在使用 MS sqlserver 2005

【问题讨论】:

  • 您使用的是哪种数据库(MySQL、SQL Server、Oracle,...)?
  • @Peter:鉴于 Rajesh 的“.Net Developer”绰号,我敢猜测他正在使用 MS SQL Server。

标签: sql sql-server sql-server-2005 sql-update


【解决方案1】:

我认为您正在寻找的东西类似于...

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。

【讨论】:

  • gr8 ,感谢很多 IT 按我的意愿工作,只有一个不起作用,最后一行在其值转移到上一行的列中没有获得空值。
  • 然后我将添加第二个更新命令,将所有非 ID 列设置为 null 其中 t1.ID = select max( t2.id ) from YourTable t2
【解决方案2】:

怎么样:

--  @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。“最后”行通过左外连接发现没有要连接的行被设置为空值。 (这假设所有连续的行都找到了。如果您丢失了一行,一组 NULL 将“潜入”并覆盖一些真实数据......)

【讨论】:

  • 请告诉我,如果我的 ID 列的数据类型是 uniqueidentifier,它会起作用吗?在什么情况下我需要做什么?
  • 首先,您应该在问题中说明它必须与唯一标识符相比,而不是整数。
  • 第二,由于您的更新完全依赖于精确排序的数据(第一个替换为第二个,第二个替换为第三个等),您需要识别该排序,并以某种方式将其放入加入子句 (mt.YourId = mt2.YourId+1)。我会为此研究 row_number() 排名函数,但这完全取决于您如何确定数据的顺序。
【解决方案3】:

您可以通过更新和加入来做到这一点。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多