MS SQL Server中通过UPDATE SELECT更新表的问题求助
正确更新Table1中Prop_id=76的Value字段
问题原因
你的原SQL语句错误在于:子查询name1未与要更新的Table1行建立关联,导致SQL Server仅取子查询结果的第一条记录值,批量覆盖所有Prop_id=76的行。
解决方案
可以通过自连接Table1的方式,关联同一个Object_id下Prop_id=55的行,再匹配Table2获取对应的Name值:
UPDATE t1_update SET t1_update.Value = t2.Name FROM Table1 t1_update -- 关联同Object_id下Prop_id=55的参考行 JOIN Table1 t1_ref ON t1_update.Object_id = t1_ref.Object_id -- 关联Table2获取对应的Name值 JOIN Table2 t2 ON t1_ref.Value = t2.NUM WHERE t1_update.Prop_id = 76 AND t1_ref.Prop_id = 55
也可以使用CTE(公共表表达式),逻辑更直观:
WITH ObjectPropRef AS ( -- 提前提取所有Object_id对应的Prop_id=55的Value SELECT Object_id, Value AS NumValue FROM Table1 WHERE Prop_id = 55 ) UPDATE t1 SET t1.Value = t2.Name FROM Table1 t1 JOIN ObjectPropRef ref ON t1.Object_id = ref.Object_id JOIN Table2 t2 ON ref.NumValue = t2.NUM WHERE t1.Prop_id = 76
核心逻辑
两种写法的本质都是:
- 定位每个
Object_id下Prop_id=55的行,获取用于匹配Table2的NUM值 - 将同一
Object_id下Prop_id=76的行的Value,替换为Table2中对应的Name
内容的提问来源于stack exchange,提问作者Twinkles
相关产品推荐
相关产品推荐

