下面是我在做更新的时候遇到报ORA-01427,单行子查询返回多行值,原因是红色部分返回了多行值

UPDATE IN_MO IM
      SET IM.BOM_ID =
             (SELECT IBR.BOM_ID
                FROM IN_ITEMBOMROUTING IBR
               WHERE     IM.ITEM_ID = IBR.PRODUCED_ITEM_ID
                     AND IM.SITEID = IBR.SITEID
                     AND EXISTS(SELECT NULL FROM IN_BOM_HEADER BH WHERE IBR.BOM_ID = BH.BOM_ID))
    WHERE     IM.ITEM_ID LIKE '%DUMMY%'
          AND IM.BOM_ID NOT IN (SELECT DISTINCT BOM_ID
                                  FROM IN_BOM_HEADER
                                 WHERE MO_BOM_MARK = '1')

我在网上看了解决办法,有些是用rownum去限制返回的值,但是这样可能会对最终数据造成影响。加distinct也是报同样的错

我们可以先将子查询报错部分做一个select

SELECT IBR.BOM_ID,IM.BOM_ID,IM.ITEM_ID
                FROM IN_ITEMBOMROUTING IBR
                join IN_MO IM
              on    IM.ITEM_ID = IBR.PRODUCED_ITEM_ID
                     AND IM.SITEID = IBR.SITEID
             where           IM.ITEM_ID LIKE '%DUMMY%'
                   AND IM.BOM_ID NOT IN (SELECT DISTINCT BOM_ID
                                  FROM IN_BOM_HEADER
                                 WHERE MO_BOM_MARK = '1')

这样就可以根据返回的值做分析了,第二个字段是要更新成第一个字段,不是第一个字段有重复值,就是第二个字段有重复值,但前面讲了加distinct也无济于事,所以很大可能是要被更新的字段有重复值

结果红色部分显示,要被更新的值有重复数据,造成了一对多的情况,分析完业务,第二并第三个字段是作为标识来作更新的,最终确定是由第三个字段重复引起的,需要对第三个字段进行加工。

不影响业务解决方式:将重复的itemid去掉,不做处理

UPDATE IN_MO IM
      SET IM.BOM_ID =
             (SELECT IBR.BOM_ID
                FROM IN_ITEMBOMROUTING IBR
               WHERE     IM.ITEM_ID = IBR.PRODUCED_ITEM_ID
                     AND IM.SITEID = IBR.SITEID
                     AND EXISTS(SELECT NULL FROM IN_BOM_HEADER BH WHERE IBR.BOM_ID = BH.BOM_ID))
    WHERE     IM.ITEM_ID LIKE '%DUMMY%'
          AND IM.BOM_ID NOT IN (SELECT DISTINCT BOM_ID
                                  FROM IN_BOM_HEADER
                                 WHERE MO_BOM_MARK = '1')
         
        AND IM.ITEM_ID NOT IN('000000????????DUMMY','000000403??????UMMY','000000???????93DUMMY','00000040?????MMY')

要是实在要在其中任选其一的话,可以用merge into在加上row_number分析函数筛选其一加以更新即可。

Oracle---智斗ORA01427的更多相关文章

  1. oracle-01427

    Oracle / PLSQL: ORA-01427 Learn the cause and how to resolve the ORA-01427 error message in Oracle. ...

  2. oracle ORA-01427: 单行子查询返回多个行

    ORA-01427: 单行子查询返回多个行 前几天开发的同事反馈一个问题,说前台系统报出了ORA错误,希望我们能看看是什么原因.java.sql.SQLException: ORA-01427: si ...

  3. oracle 错误代码大全

    oracle错误代码大全(超详细)   ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最 ...

  4. Oracle经典SQL

    最近本人整理了一些Oracle sql,现分享给大家,后续还会更新.如果有错误的地方,请指正,共同学习.贴上去的sql都是我测试过的,大家可以粘贴在自己的电脑上试试. 1.查询部门的名称,及最低收入雇 ...

  5. oracle练习题

    题干:设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher). 建表后数据如下: SQL> select * from ...

  6. oracle错误码

    ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出 ...

  7. Oracle 错误代码

    ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出 ...

  8. Oracle创建删除用户,角色,表空间,导入导出数据库命令总结(转载)

    无意间看到一篇文章,觉得对于ORACLE的新手很实用,特转载,原文出处这里 说明:在创建数据库时输入的密码,是修改系统默认的密码,以system和sysman等系统默认身份登录时要输入的密码就是修改后 ...

  9. Oracle 错误码

    Oracle作为一款比较优秀同时也比较难以掌握的大型数据库,在我们学习使用的过程中,不可避免的会遇到一些错误,为此 Oracle 给出了一套完备的错误消息提示机制 我们可以根据Oracle给出的消息提 ...

  10. oracle数据库-错误编码大全

    ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件   ORA-00018: 超出最大会话数   ORA-00019: 超出最大会话许可数   ORA-000 ...

随机推荐

  1. xmake新增对Cuda代码编译支持

    最近研究了下NVIDIA Cuda Toolkit的编译环境,并且在xmake 2.1.10开发版中,新增了对cuda编译环境的支持,可以直接编译*.cu代码. 关于Cuda Toolkit相关说明以 ...

  2. Linux 系统多台主机之间做SSH免密码登陆

    SSH 免密登录 环境说明 CentOS 7.3 关键点 免密登录的关键点在于理解谁登录谁. A 生成的公钥给 B,也给 C.D,则 A 可以直接免密 SSH 登录 B.C.D A 生成密钥 在 A ...

  3. 关于golang select的用法

    1 go的信道 1.1 什么是信道 信道可以理解为go协程之间进行通信的通道. 1.2 信道的声明 所有的信道都关联一个类型,一旦关联了类型,该信道就只能传输该类型的数据,传输其它类型的数据的话就是非 ...

  4. Windows系统里Oracle 11g R2 Client(64bit)的下载与安装

    环境: windows10系统(64位) 最好先安装jre或jdk(此软件用来打开oracle自带的可视化操作界面,不装也没关系:可以安装plsql,或者直接用命令行操作) Oracle 11g 是仅 ...

  5. Windows node.js安装运行npm显示类似"ENOENT, stat 'C:\Users\XXXX\AppData\Roaming\npm'错误

    这个错误是在玩一个小的博客的时候,使用到node.js,正好使用的是windows系统就安装了一个windows32的node.js版本 结果一运行npm就出现如上的错误,后来发现,只要在上面提到的目 ...

  6. java基础笔记(8)

    java的多线程 进程:程序的执行过程,持有内存资源 线程:是系统的最小执行单元,共享进程的资源 线程之间可以互斥.也可以同步: Thraed类: 通过一个案例来了解线程Thread类和Runnabl ...

  7. 区块链开源实现hyperledger fabric架构详解

    hyperledger fabric是区块链中联盟链的优秀实现,主要代码由IBM.Intel.各大银行等贡献,目前v1.1版的kafka共识方式可达到1000/s次的吞吐量.本文中我们依次讨论:区块链 ...

  8. 新建maven子模块 出现 Unable to read parent POM

    新建maven子模块 出现 Unable to read parent POM错误 于是把pom.xml文件中的 中文字符全部删除 包括 注释 最后成功建立

  9. MongoDB的使用学习之(四)权限设置--用户名、密码、端口==

    本文参照:http://hi.baidu.com/tianhuimin/item/590d96cfd7ac1509c610b26a 本人也是按照此文章操作的,但是有些不妥,红色文字就是我实践后,需要改 ...

  10. Eclipse Git分支实战

    切换分支 右键工程,创建新分支 命名新分支 点击finish,可以看到项目已经切换到hot_fix 修改代码: Ctrl+#提交到本地仓库,之后提交到远程仓库 Next,Finish 等待一下, 点击 ...