下面是我在做更新的时候遇到报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. 右击main 方法运行正常,启动tomcat 后,spring boot 项目 出现参数字符串是乱码的情况

    PrintWriter out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8")) ...

  2. SpringBoot 使用 RestTemplate 调用exchange方法 显示错误信息

    SpringBoot使用RestTempate SpringBoot使用RestTemplate摘要认证 SpringBoot使用RestTemplate基础认证 SpringBoot使用RestTe ...

  3. oracle 实现mysql find_set_in函数

    create or replace FUNCTION F_FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',' ...

  4. C++编译器对属性的初始化检查远没有Java严格

    C++编译器对属性的初始化检查远没有Java严格// Java编译通过:class yy { public static void main(String[] args) { int i; Syste ...

  5. pL/Sql插入语句时报错,对表空间没有权限 对表空间 'USERS' 无权限

    进入dba为其授予权限:sqlplus sys/admin as sysdba; 为用户授予权限即可 grant unlimited tablespace to username;

  6. Linux 设置定时清除buff/cache的脚本

    Linux 设置定时清除buff/cache的脚本 查看内存缓存状态 [root@heyong ~]# free -m total used free shared buff/cache availa ...

  7. python之模块导入和包

    一.何为模块 1.一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2.模块目的和函数,对象等一样,是为了代码的复用性而存在的.即一个py程序写了很多功能,也可 ...

  8. Verilog-2001标准在2001年就发布了

      ,不过翻了一些Verilog书籍,对Verilog-2001的新增特性很少有提及,即使提到了,也只是寥寥数语带过,其实在Verilog-2001中做了很多有用的改进,给编程带来很大的帮助,有必要详 ...

  9. caffe与tensorflow中的pooling

    两个框架对poolin的处理方式不同,这就导致在转模型时容易踩雷 tensorflow通过“VALID”和“SAME”参数来控制 caffe 通过pad值来控制 参考:https://blog.csd ...

  10. JAVA(-Xms,Xmx,Xmn-XX:newSize,-XX:MaxnewSize,-XX:PermSize,-XX:MaxPermSize)区别

    1.-Xms:表示java虚拟机堆区内存初始内存分配的大小,通常为操作系统可用内存的1/64大小即可,但仍需按照实际情况进行分配.2.-Xmx:表示java虚拟机堆区内存可被分配的最大上限,通常为操作 ...