更新命令: - ORA-01427:"单行子查询返回多行"

时间:2015-05-19 13:47:17

标签: oracle

我的疑问:

update bl1_customer bl
  set bl.CYCLE_CODE=(select c.BILL_CYCLE
                       from canba_bs3 c
                       inner join bl1_customer bl
                         on c.CUSTOMER_ID=bl.CUSTOMER_ID)
  where exists (select c.BILL_CYCLE
                  from canba_bs3 c
                  inner join bl1_customer bl
                    on c.CUSTOMER_ID=bl.CUSTOMER_ID) and
        bl.status='O';

update bl1_customer bl
  set bl.CYCLE_CODE=(select c.BILL_CYCLE
                       from canba_bs3 c
                       inner join bl1_customer bl
                         on c.CUSTOMER_ID=bl.CUSTOMER_ID)
  where exists (select c.BILL_CYCLE
                  from canba_bs3 c
                  inner join bl1_customer bl
                    on c.CUSTOMER_ID=bl.CUSTOMER_ID) and
        bl.status='O';

错误:

ERROR at line 1:
ORA-01427: single-row subquery returns more than one row

请帮我解决一下

5 个答案:

答案 0 :(得分:0)

您尝试执行包含返回多行的SQL子查询的SQL语句。 您应该检查更新条件。尝试将其作为SELECT查询运行并查看结果。

答案 1 :(得分:0)

由于SET子句中的子查询,即

,因此引发了错误。
select c.BILL_CYCLE
  from canba_bs3 c
  inner join bl1_customer bl
  on c.CUSTOMER_ID=bl.CUSTOMER_ID

返回多行。

祝你好运。

答案 2 :(得分:0)

您需要使用相关的子查询:

update bl1_customer bl
set bl.CYCLE_CODE=( select c.BILL_CYCLE
                    from   canba_bs3 c
                    where  c.CUSTOMER_ID=bl.CUSTOMER_ID )
where bl.status='O'
AND   EXISTS(       select 1
                    from   canba_bs3 c
                    where  c.CUSTOMER_ID=bl.CUSTOMER_ID );

您还需要确保表canba_bs3每个客户只包含一行。

答案 3 :(得分:0)

您对更新表使用相同的别名bl,在子查询中使用内部联接表。当您使用该别名时,内部表将具有优先权。

因此,子查询与更新的行没有任何限制,因此子查询将返回每个更新行的所有值。

如果每个bl1_customer最多只有一个BILL_CYCLE,您可以通过这种方式重新更新您的更新:

update bl1_customer bl
   set bl.CYCLE_CODE=(select c.BILL_CYCLE
                        from canba_bs3 c
                       WHERE c.CUSTOMER_ID=bl.CUSTOMER_ID)
 WHERE EXISTS (SELECT 1 FROM canba_bs3 WHERE CUSTOMER_ID=bl.CUSTOMER_ID)
       and bl.status='O';

答案 4 :(得分:0)

好的,有几点要指出。

名称范围。在这两种情况下,嵌套选择都包含对同一个表的引用,该别名与主语句具有相同的别名。如果你认为这将他们联系在一起就是错的。 " b1"外部作用域中的别名在嵌套查询中失效,因为本地别名优先。因此,您给出的陈述可以用英语解释为:

"更新bl1_customer表,将周期代码设置为与客户关联的所有周期的周期代码,状态为0的每一行以及是否存在任何客户的账单周期记录#34;

你想要做什么,我想是"将带有cycle_Code =的bl1_customer表更新为canba_bs3中为该客户找到的cycle_code。"

这仍然无法描述完整的解决方案,因为它没有回答:

问题:如果canba_bs3中给定的bl1_Customer没有此类记录,您是否将此客户的cycle_code更新为null?或者在该字段中保留任何预先存在的值?

问题:如果canba_bs3中给定的bl1_Customer有多个这样的记录,你用它来更新cycle_code字段?

现在,如果我们假设canba_b3中每个customer_bl1最多只能有一条记录,那么1010给出的答案是正确的。

但是,坦率地说,要求我们在不给予我们声明意图的情况下解决问题是一种浪费的行为。