更新FileLoadStatus表RunningTotal列时遇子查询返回多值错误
错误原因与解决方法
错误根源
你执行的UPDATE语句中,赋值用的子查询没有关联当前要更新的FileLoadStatus行,导致子查询返回所有符合条件的Total值(多行),而SET RunningTotal =要求右侧必须是单个值,因此触发了Subquery returned more than 1 value的报错。
修正方案
方案1:使用UPDATE JOIN(推荐,性能更优)
直接通过JOIN关联两张表,精准匹配每一行进行更新:
UPDATE FS SET FS.RunningTotal = T.Total FROM [dbo].[FileLoadStatus] FS JOIN [dbo].[Totals] T -- 从FileName中提取SiteID并与Totals表匹配(注意类型转换) ON SUBSTRING(FS.FileName, CHARINDEX('_', FS.FileName) + 1, (LEN(FS.FileName) - CHARINDEX('_', REVERSE(FS.FileName))) - CHARINDEX('_', FS.FileName)) = CAST(T.SiteID AS VARCHAR(10)) -- 从FileName中提取Date并与Totals表匹配 AND LEFT(RIGHT(FS.FileName, CHARINDEX('_', REVERSE(FS.FileName)) - 1), 10) = T.Date
方案2:修正子查询关联逻辑
让子查询仅返回当前更新行对应的单个Total值:
UPDATE [dbo].[FileLoadStatus] SET [RunningTotal] = ( SELECT T.Total FROM [dbo].[Totals] T WHERE SUBSTRING([FileName], CHARINDEX('_', [FileName]) + 1, (LEN([FileName]) - CHARINDEX('_', REVERSE([FileName]))) - CHARINDEX('_', [FileName])) = CAST(T.SiteID AS VARCHAR(10)) AND LEFT(RIGHT([FileName], CHARINDEX('_', REVERSE([FileName])) - 1), 10) = T.Date ) -- 可选:仅更新能在Totals表中找到匹配的行 WHERE EXISTS ( SELECT 1 FROM [dbo].[Totals] T WHERE SUBSTRING([FileName], CHARINDEX('_', [FileName]) + 1, (LEN([FileName]) - CHARINDEX('_', REVERSE([FileName]))) - CHARINDEX('_', [FileName])) = CAST(T.SiteID AS VARCHAR(10)) AND LEFT(RIGHT([FileName], CHARINDEX('_', REVERSE([FileName])) - 1), 10) = T.Date )
注意事项
- 显式转换类型:
SiteID是数值类型,截取的FileName片段是字符串,需用CAST(T.SiteID AS VARCHAR(10))确保类型匹配,避免隐式转换导致的匹配错误或性能问题。 - 数据唯一性:确保每个
FileName对应的SiteID+Date组合在Totals表中仅有一条记录,如果存在多条,需明确指定取值逻辑(比如MAX(T.Total)、MIN(T.Total))。
内容的提问来源于stack exchange,提问作者Jam_Jam
相关产品推荐
相关产品推荐

