首页 > 解决方案 > 运行查询时子查询错误消息

问题描述

UPDATE rm 
SET rm.cost_sqft = ISNULL((SELECT 
                               CASE 
                                  WHEN (rm.rm_cat IN ('8','NON-REPORT') AND rm.space_fee = 'No') 
                                     THEN '0' 
                                     ELSE rent_w.w * @rental_rate 
                               END
                           FROM 
                               @rental_weight AS rent_w, bl, rm          
                           WHERE 
                               rm.main_contact = rent_w.space_type
                               AND rm.description = rent_w.space_quality
                               AND bl.cost_type = rent_w.campuse_cost       
                               AND bl.bl_id = rm.bl_id),'0') 
WHERE rm.bl_id = @bl_id
  AND rm.fl_id = @fl_id
  AND rm.rm_id = @rm_id 

运行此语句时,我收到此错误:

消息 512,级别 16,状态 1,过程 icat_rm_cost_sqft,第 100 行 [批处理开始第 2 行]
子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

标签: sqlsubquery

解决方案


该错误意味着子查询(选择)为要应用于更新的给定键返回多行。

考虑一下更新变成这种非常人为的场景的场景:

名为 Customer 的表中的示例数据:

cust_id   cust_type     name
1          X            Fred
1          Y            jack

以及将产生错误的查询:

update customer
    set name = (
           select "MR " || name
           from customer
           where cust_id = 1 /* returns Fred and Jack */
        )
    where cust_id = 1 and cust_type = 'X';

客户 1X 应更新为什么名称?“弗雷德先生”还是“杰克先生”?RDBMS 无法为您做出决定,您需要将查询修改为相关子查询(在 cust_type 上添加连接条件)或仅返回一行的子查询。

当然,上述内容非常做作,但这就是错误告诉您的内容。


推荐阅读