1

我有一个查询要停用一些已激活的帐户。基本上,它查看 year_end_close 表,并且那里存在的任何帐户都在主表中更新为非活动状态(A 或 B)。

update master
 set account_type = case account_type
  when 'C' then 'A'
  when 'D' then 'B'
  else account_type
 end
where account_num = 
      (select account_num 
       from year_end_close 
       where account_type in('C', 'D'))`

我从 where 子句中得到“子查询返回超过 1 个值”——我做错了什么?当我注释掉 where 子句时,我不再得到那个错误,所以它在那个子句中。

4

3 回答 3

2

改变你=IN

UPDATE master
SET account_type =
   CASE account_type
      WHEN 'C' then 'A'
      WHEN 'D' then 'B'
      ELSE account_type
   END
WHERE account_num IN
(
   SELECT account_num
   FROM year_end_close
   WHERE account_type IN('C', 'D')
)

通过使用,=您是说您要将左侧的=1 项与右侧的 1 项进行比较。带有of或的不止一个account_num。这使您的子查询返回超过 1 个结果。查询无法确定子查询中的哪个值应与左侧的值匹配。使用允许查询检查子查询中任何有效的左值。year_end_closeaccount_typeCDINaccount_num

于 2013-04-09T23:00:30.243 回答
0

尝试 IN 而不是检查是否相等:

update master
 set account_type = case account_type
  when 'C' then 'A'
  when 'D' then 'B'
  else account_type
 end
where account_num IN (select account_num from year_end_close where account_type in('C', 'D'))`

...尽管这取决于您的数据/架构。

于 2013-04-09T23:00:22.397 回答
0

@matt 和 @Adam 的其他答案是正确的 - 您需要使用In而不是=坚持使用子查询。但我认为这与以下内容相同:

UPDATE m Set
   account_type = 
    Case account_type
       WHEN 'C' then 'A'
       WHEN 'D' then 'B'
       ELSE account_type END
From master m Join year_end_close c
    On c.account_num  = m.account_num 
       And c.account_type in ('C', 'D')

编辑:此语法适用于 MS Sql Server,但可能不适用于所有其他供应商的数据库产品。您使用的是哪个数据库?

于 2013-04-09T23:06:37.277 回答