如何在SQL中将查询结果添加至现有表(基于指定列值匹配)
问题分析与解决
你的UPDATE语句没生效的核心原因是:子查询返回的是所有门店的工作日平均值集合(多行结果),数据库无法将这个集合与原表的每一行做对应匹配,自然没法正确赋值到weekday_avg列。
正确的更新方式
方法1:关联子查询(通用多数数据库)
在子查询中添加与外部表的store关联条件,让数据库明确知道每一行应该取对应门店的平均值:
UPDATE store_sales s SET weekday_avg = ( SELECT AVG(Sales) FROM store_sales WHERE Weekday = 'Weekday' AND store = s.store -- 关键:匹配当前行的门店 );
这个语句会针对原表的每一行,找到对应门店的工作日销售额平均值,然后赋值给该行的weekday_avg列。比如门店10的工作日销售额是11000,那么它的所有行(不管是Weekday还是Weekend)的weekday_avg都会被设为11000,完全符合你的需求。
方法2:JOIN式更新(适合MySQL、PostgreSQL等支持JOIN的数据库)
先预计算各门店的工作日平均值,再通过JOIN关联原表进行更新,这种方式在数据量大时性能更优:
UPDATE store_sales s JOIN ( -- 先算出每个门店的工作日平均销售额 SELECT store, AVG(Sales) AS avg_weekday_sales FROM store_sales WHERE Weekday = 'Weekday' GROUP BY store ) calc_avg ON s.store = calc_avg.store SET s.weekday_avg = calc_avg.avg_weekday_sales;
可选优化:处理无工作日数据的门店
如果有些门店没有任何工作日销售数据,上面的语句会把它们的weekday_avg设为NULL。如果需要默认值(比如0),可以用COALESCE函数包裹子查询:
UPDATE store_sales s SET weekday_avg = COALESCE( (SELECT AVG(Sales) FROM store_sales WHERE Weekday = 'Weekday' AND store = s.store), 0 -- 无数据时设为0,可根据需求调整 );
内容的提问来源于stack exchange,提问作者RIchXIII
相关产品推荐
相关产品推荐

