如何基于SELECT查询结果逐行更新Sales_Data表的Revenue列?
解决UPDATE语句中子查询返回多行的问题
问题原因
你当前的UPDATE语句里,SET后的子查询返回了全部56046行的Revenue计算结果,但SQL要求这个位置的子查询必须仅返回单个值(对应要更新的当前行),因此触发了报错。
正确写法1:使用UPDATE JOIN(推荐)
直接通过JOIN关联两张表,一次性完成更新,效率更高:
UPDATE Sales_Data SET Revenue = Sales_Data.OrderQuantity * Product_Lookup.ProductPrice FROM Sales_Data INNER JOIN Product_Lookup ON Product_Lookup.ProductKey = Sales_Data.ProductKey
正确写法2:使用关联子查询
如果一定要用子查询,需要让子查询与外层的Sales_Data行绑定,确保每次只返回当前行的计算值:
UPDATE Sales_Data SET Revenue = ( SELECT sd.OrderQuantity * pl.ProductPrice FROM Product_Lookup pl WHERE pl.ProductKey = Sales_Data.ProductKey )
这种写法里,子查询通过pl.ProductKey = Sales_Data.ProductKey和外层要更新的行关联,每次仅返回当前行对应的Revenue值,不会出现多行结果的问题。
补充说明
- 两种写法都会把匹配到Product_Lookup的Sales_Data行的Revenue列更新为计算值;
- 如果Sales_Data中存在ProductKey在Product_Lookup里无匹配的行,写法2会将这些行的Revenue设为NULL,写法1则不会修改这些行(因为INNER JOIN仅保留匹配的行)。
内容的提问来源于stack exchange,提问作者StefR
相关产品推荐
相关产品推荐

