2015-05-19 92 views
0

我的查询:更新命令: - ORA-01427: “单行子查询返回多个行”

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 

请帮我解决这个问题

+0

两个更新是相同的?或者我错过了一个区别? – 1010

回答

0

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

+0

我已经做了它,它已经返回了多个,但我用过也存在 –

+0

你确定这个结果限于一行: (从canba_bs3中选择c.BILL_CYCLE)c内部连接b1_customer在c上.CUSTOMER_ID = bl.CUSTOMER_ID) – teoreda

+0

它返回多个 –

0

你得到的错误引发,因为子查询中的SET子句中,即

select c.BILL_CYCLE 
    from canba_bs3 c 
    inner join bl1_customer bl 
    on c.CUSTOMER_ID=bl.CUSTOMER_ID 

回报超过一排。

祝你好运。

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只包含每个客户一行。

0

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

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

如果有至多一个BILL_CYCLE每个bl1_customer你可以修改你的更新是这样的:

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'; 
0

OK,几件事情要指出。

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

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

你想要做什么,我会想象的是”用cycle_Code =将bl1_customer表更新为canba_bs3中为该客户找到的cycle_code“。

问:如果在canba_bs3对于给定bl1_Customer没有这样的记录,你更新cycle_code为null该客户

,因为它并没有回答这依然不能描述一个完整的解决方案吗?或者在该领域留下任何预先存在的价值?

问题:如果canba_bs3中的某个给定bl1_Customer存在多个此类记录,而您更新了cycle_code字段?

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

但坦白地说,要求我们解决问题而不给我们陈述意图坦率地说,是一种浪费的锻炼。

相关问题