You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:10:24