更新不连续/跳过 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 表中的特定列的主要内容,如果未能解决你的问题,请参考以下文章