为具有匹配列值的行更新具有相同值的uniqueidentifier列



我需要一点帮助。我有这样一个(简化的)表:

标题tbody> <<tr>2456
ID子类型RelatedUniqueID
1我的标题11
我的标题21
3我的标题32
我的标题42
我的标题52
我的标题63

由于newid()是逐行应用的,因此必须首先生成,因此必须使用临时或永久表来存储相关的ID>子类型值。

所以首先你需要为子类型: 生成GUID值
with subtypes as (
select distinct subtype
from t
)
select Subtype, NewId() RelatedId into #Id
from subtypes

然后你可以使用可更新的CTE将这些应用到你的基表:

with r as (
select t.*, id.RelatedId
from #id id
join t on t.subtype=id.Subtype
)
update r
set relatedUniqueId=RelatedId

参见示例DB<>Fiddle

您可以使用带有窗口函数的可更新CTE来获取这些数据:

with r as (
select t.*,
RelatedId = first_value(newid()) over (partition by t.Subtype order by ID rows unbounded preceding)
from t
)
update r
set relatedUniqueId = RelatedId;

,db&lt的在小提琴


我警告说,newid()在计算时是不可预测的,所以不要尝试混淆连接更新(除非你像@Stu那样预先保存id)。

例如,看这个小提琴,每一行的id计算不同。

我已经找到了单个查询解决方案。

工作的先决条件是RelatedUniqueID必须已经包含随机值。(例如设置默认字段值为newid)

UPDATE TestTable SET ForeignUniqueID = TG.ForeignUniqueID FROM TestTable TG INNER JOIN TestTable ON TestTable.SubType = TG.SubType

正如Stu在评论中提到的,这个解决方案可能会影响大型数据集的性能。请记住这一点。

相关内容

  • 没有找到相关文章

最新更新