【问题标题】:Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, or when the subquery is used as an expression子查询返回超过 1 个值。当子查询跟在 =、!= 之后或当子查询用作表达式时,这是不允许的
【发布时间】:2014-12-24 18:08:23
【问题描述】:

我需要更新 tableA 的 total 字段 查询结果 按 DATE,RNAME 从 SALES 组中选择 SUM(amt)

我试过这样

update tableA set Total=(select sum(billamt) from SALES group by DATE,RNAME)

显示错误 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

【问题讨论】:

  • 这只是意味着子查询返回超过 1 行。您应该确保子查询仅返回 1 行。您可以使用前 1 个。
  • 像这样尝试update tableA set Total= amt from (select sum(billamt)as amt from SALES group by DATE,RNAME)。还是不行..:(
  • 查看 BobTheBuilder 的回答。如果子查询返回多于 1 行,则会产生错误。
  • 试过这样。还是行不通。 update tableA set Total=(select sum(b.BILLAMT) from SALES b where b.date>='2014-10-01' and b.date
  • 当也按日期分组时,它仍然为您提供三行。将其更改为:其中 b.date = '2014-10-02'。有帮助吗?

标签: sql-server vb.net


【解决方案1】:

查询:

select sum(billamt) from SALES group by DATE,RNAME

返回billamtsum,按DATE,RNAME 分组。

如果您有多个 DATERNAME 唯一值,则返回值是一个表(而不是一个字段)。

您可以单独运行此查询并检查返回值。

如错误所述,您不能为一个字段设置多个值。

【讨论】:

  • ohh.k 那么我如何用每天每个 Rname(person) 的 billamt 总和来更新表格.. ??实际上,出于某些特定原因,我正在创建一个临时表并更新这些字段。有什么办法吗?
  • 试过这样。还是行不通。 update tableA set Total=(select sum(b.BILLAMT) from SALES b where b.date>='2014-10-01' and b.date
  • 运行这个查询: select sum(b.BILLAMT) from SALES b where b.date>='2014-10-01' and b.date
【解决方案2】:

尝试类似:

update A
set Total = B.Total
From tableA  A
Inner Join (select DATE,RNAME,sum(billamt) Total from SALES group by DATE,RNAME) B
On A.Date = B.Date and A.RName = B.RNAme

【讨论】:

  • 它的工作..但如果 R​​name 为空,则为空。如果 rname 不在表中,如何更新总数。
  • 它的工作。但是有一种情况,销售表中的 Rname 可以为空。在这种情况下,我需要在特定日期更新账单金额。
  • 对这种情况使用另一个更新语句。这次只是按日期分组。
  • 它工作了..:) 如前所述,使用了另一个更新语句。
【解决方案3】:

由于上述问题中的表结构不清楚,我假设tableA有Total、Date和RName列

update tableA set tableA.total = 
a.total from (select SUM(amt) as total, date, rname from SALES group by DATE,RNAME) as a
where a.date = tableA.date and tableA.rname = a.rname

-- 编辑“销售表中 Rname 可以为空的情况”使用

update tableA set tableA.total = a.total
from (select SUM(amt) as total, date, rname from #t1 group by DATE,RNAME) as a
where a.date = tableA.date and tableA.rname = a.rname
OR (a.date = tableA.date AND tableA.rname IS NULL and a.rname IS NULL)

-- 进一步阐述

CREATE TABLE #t1 (amt decimal(18,2), [date] date, rname varchar(50))
INSERT INTO #t1
SELECT 1.9, GETDATE() - 1, NULL
UNION ALL
SELECT 1.9, GETDATE() - 1, NULL
UNION ALL
SELECT 8.9, GETDATE() - 1, NULL
UNION ALL
SELECT 8.9, GETDATE(), NULL
UNION ALL
SELECT 2.9, GETDATE() - 1, 'N1'
UNION ALL
SELECT 2.8, GETDATE() - 1, 'N1'

CREATE TABLE #t2 (total decimal(18,2), [date] date, rname varchar(50))
INSERT INTO #t2
SELECT 0, GETDATE() - 1, NULL
UNION ALL
SELECT 0, GETDATE() - 1, 'N1'

update #t2 set #t2.total = a.total
from (select SUM(amt) as total, date, rname from #t1 group by DATE,RNAME) as a
where a.date = #t2.date and #t2.rname = a.rname
OR (a.date = #t2.date AND #t2.rname IS NULL and a.rname IS NULL)


SELECT * FROM #t2 

我希望它现在清楚

【讨论】:

  • 它的工作。但是有一种情况,销售表中的 Rname 可以为空。在这种情况下,我需要在特定日期更新账单金额。
  • @Indrah - 查看编辑后的答案和完整示例。我希望这能解决您的问题
猜你喜欢
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 2016-08-02
相关资源
最近更新 更多