更新不连续/跳过 Id 表中的特定列

Posted

技术标签:

【中文标题】更新不连续/跳过 Id 表中的特定列【英文标题】:Updating specific columns within the table of unsequential/skipping Id's 【发布时间】:2020-11-03 18:00:06 【问题描述】:

我有一个大约 4k 行的表,只需要特定列中的数据。

换句话说,仅更新所有行中的特定列,同时不触及现有列的数据 - 具有非顺序 ID,例如(1,2,3,4,7,8,9,11 等)。

所以我写的这个查询失败了:

  UPDATE dbo.SURFACE2
  SET Xwgs = dt.Xwgs, Ywgs = dt.Ywgs
  FROM 
     (
        SELECT
            Id as InId,
            Xwgs,
            Ywgs
        FROM dbo.SURFACE2
        WHERE 
            Id BETWEEN 3693 AND 7369
     ) dt
  WHERE
    Id = dt.InId - 3692

由于 ID 是非连续的,因此并非所有行都已填充,并且许多行都被错误填充(在预期的目标行中,我有前一个源行的数据)。

在不必将其重新创建到具有排序 Id 的新表中的情况下,有什么更好的方法来完成此任务?

【问题讨论】:

【参考方案1】:

您的查询很好,但可以简化为:

UPDATE s
  SET Xwgs = dt.Xwgs,
        Ywgs = dt.Ywgs
  FROM dbo.SURFACE2 s JOIN
       dbo.SURFACE2 ss
       ON s.Id = ss.InId - 3692
  WHERE ss.Id BETWEEN 3693 AND 7369;

【讨论】:

我的“灯泡”闪烁 - 将尝试一些东西 - 感谢您的时间;)【参考方案2】:

如果我没听错,你可以先用row_number()重新编号行,然后应用逻辑:

with cte as (select s.*, row_number() over(order by id) rn from surface2)
update t
set t.Xwgs = s.Xwgs, t.Ywgs = s.Ywgs
from cte t
inner join cte s on s.rn = t.rn - 3692
where t.rn between 3693 and 7369

【讨论】:

【参考方案3】:

查询是直接的;事实证明,我从 excel表格。

【讨论】:

以上是关于更新不连续/跳过 Id 表中的特定列的主要内容,如果未能解决你的问题,请参考以下文章

oracle 怎么得到一个表中连续ID中断开的ID

在SQL中如果主键字段是不连续的 如何查出表中的第三四条数据

MYSQL计算连续与不连续区间的方法

创建由多列和连续日期分区的序列

查找连续周人员出现在表中

连续检查 MySQL 表更新的最佳方法是啥?