下面是我在做更新的时候遇到报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. Flask框架(三)—— 请求扩展、中间件、蓝图、session源码分析

    Flask框架(三)—— 请求扩展.中间件.蓝图.session源码分析 目录 请求扩展.中间件.蓝图.session源码分析 一.请求扩展 1.before_request 2.after_requ ...

  2. Python 入门之Python基础知识

    Python 入门之Python基础知识 1.变量 (1)变量就是把程序运行的中间结果临时存在内存中,以便后续代码使用 (2)变量的作用: 昵称,就是代指内存中某个地址中的内容 a = 123 变量名 ...

  3. 异步IO\数据库\队列\缓存\RabbitMQ队列

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SS ...

  4. Django 调试models 输出的SQL语句 定位查看结果

    django 调试models变得更为简单了,不用像之前的版本, 手工去调用django query, 才能打印出之前的代码是执行的什么SQL语句. 1.3开始只需在settings.py里,配置如下 ...

  5. ACdream 1424 Diversion( 树链剖分 )

    Diversion Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit St ...

  6. ECCV2014 Accepted paper

    今天早上看到小伙伴们说ECCV2014结果出来了, 自己于是赶紧看了下, 感觉ECCV2014显著性的文章和以往的不太一样. 1.Salient Montages from Unconstrained ...

  7. python学习笔记(5)

    第七章   模式匹配和正则表达式 1.不用正则表达式来查找文本模式 #对于这样的一个文本查找:3个数字,一个短横线,3个数字,4个端横线,然后再是4个数字,如:415-555-4242def isPh ...

  8. CentOS7.6中 KVM虚拟机内存、CPU调整

    CentOS7.6中 KVM虚拟机内存.CPU调整 一.调小虚拟机内存 调小虚拟机内存可以动态实现,不用关机 1.查看当前内存大小 [root@heyong kvm]# virsh dominfo t ...

  9. Array.prototype

    Array.prototype  属性表示 Array 构造函数的原型,并允许您向所有Array对象添加新的属性和方法. /* 如果JavaScript本身不提供 first() 方法, 添加一个返回 ...

  10. 005-(已测试成功的方案)kickstart模式实现批量安装centos7.x系统

    1.1 安装系统的方法 l  光盘(ISO文件,光盘的镜像文件)===>>每一台物理机都得给一个光驱,如果用外置光驱的话,是不是每台机器都需要插一下 l  U盘:ISO镜像刻录到U盘==& ...