【问题标题】:Oracle sql update with table join giving errorOracle sql更新与表连接给出错误
【发布时间】:2015-12-11 13:27:41
【问题描述】:

我正在运行以下 Oracle 更新语句并出现错误:

ORA-01427: 单行子查询返回多于一行

UPDATE Maximo.laborcraftrate lcr
SET lcr.controlaccount = (SELECT c.mxrcontrolaccount
                     FROM maximo.contract c
                     WHERE lcr.contractnum = c.CONTRACTNUM)
WHERE EXISTS (SELECT controlaccount
              FROM maximo.contract c
              WHERE lcr.contractnum = c.contractnum);   

有人知道如何限制子查询吗?

编辑:

这是一个显示表之间连接的选择语句。我想做的是在这些条件下用 b.controlaccount 更新 a.controlaccount:

CRAFT   CONTRACTNUM CONTROLACCOUNT  MXRCONTROLACCOUNT
TR-CHNDI    TR-GENERAL      01-3010-72515
TR-CHNDP             TR-GENERAL     01-3010-72515
TR-CHNDI             TR-GENERAL     01-3010-72515
TR-CHNDI             TR-GENERAL     01-3010-72515
TR-CHNDP             TR-GENERAL     01-3010-72515
TR-FENI          TR-GENERAL     01-3010-72515
select a.craft,a.contractnum,a.controlaccount,b.mxrcontrolaccount
from maximo.laborcraftrate a
left join maximo.contract b on a.contractnum = b.contractnum
where a.contractnum is not null

【问题讨论】:

  • 你可以做"(SELECT MAX(c.mxrcontrolaccount)"。但问题是:如果有不同的值你想要什么?
  • 为什么是WHERE c.contractnum = c.CONTRACTNUM?也许WHERE c.contractnum = lcr.CONTRACTNUM
  • 我不明白怎么会有多个值,因为每个laborcraftrate只有一个合同,但一个合同可以有多个laborcraftrate,所以我担心使用max会给出不正确的结果
  • @Tatiana - 这是问题中的错字,我已编辑,但问题是一样的
  • 运行select contractnum, count(*) from maximo.contract group by contractnum having count(*) > 1,这将为您提供在子查询中可能返回多于一行的行。然后你必须弄清楚你的数据或查询是否有问题。

标签: sql oracle sql-update


【解决方案1】:

您对错误有什么不明白的地方?子查询返回不止一行。

一个简单的解决方案是添加and rownum = 1:

UPDATE Maximo.laborcraftrate lcr
    SET lcr.controlaccount = (SELECT c.mxrcontrolaccount
                              FROM maximo.contract c
                              WHERE lcr.contractnum = c.CONTRACTNUM AND rownum = 1
                             )
    WHERE EXISTS (SELECT controlaccount
                  FROM maximo.contract c
                  WHERE lcr.contractnum = c.contractnum);  

或者使用聚合函数。这两个都保证最多一排。然而,这个问题不一定适合简单的修复。通常存在逻辑问题。

【讨论】:

  • 从上面的 cmets 运行查询以检查重复项帮助我解决了这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
相关资源
最近更新 更多