我需要一点帮助。我有这样一个(简化的)表:
ID | 标题子类型 | RelatedUniqueID | 1 | 我的标题1 | 1 | 空 | 2
---|---|---|---|
我的标题2 | 1 | 空 | |
3 | 我的标题3 | 2 | 空 |
我的标题4 | 2 | 空 | |
我的标题5 | 2 | 空 | |
我的标题6 | 3 | 空 |
由于newid()
是逐行应用的,因此必须首先生成值,因此必须使用临时或永久表来存储相关的ID>子类型值。
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<的在小提琴
我警告说,newid()
在计算时是不可预测的,所以不要尝试混淆连接更新(除非你像@Stu那样预先保存id)。
例如,看这个小提琴,每一行的id计算不同。
我已经找到了单个查询解决方案。
工作的先决条件是RelatedUniqueID必须已经包含随机值。(例如设置默认字段值为newid)
UPDATE TestTable SET ForeignUniqueID = TG.ForeignUniqueID FROM TestTable TG INNER JOIN TestTable ON TestTable.SubType = TG.SubType
正如Stu在评论中提到的,这个解决方案可能会影响大型数据集的性能。请记住这一点。