Oracle---智斗ORA01427
下面是我在做更新的时候遇到报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的更多相关文章
- oracle-01427
Oracle / PLSQL: ORA-01427 Learn the cause and how to resolve the ORA-01427 error message in Oracle. ...
- oracle ORA-01427: 单行子查询返回多个行
ORA-01427: 单行子查询返回多个行 前几天开发的同事反馈一个问题,说前台系统报出了ORA错误,希望我们能看看是什么原因.java.sql.SQLException: ORA-01427: si ...
- oracle 错误代码大全
oracle错误代码大全(超详细) ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最 ...
- Oracle经典SQL
最近本人整理了一些Oracle sql,现分享给大家,后续还会更新.如果有错误的地方,请指正,共同学习.贴上去的sql都是我测试过的,大家可以粘贴在自己的电脑上试试. 1.查询部门的名称,及最低收入雇 ...
- oracle练习题
题干:设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher). 建表后数据如下: SQL> select * from ...
- oracle错误码
ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出 ...
- Oracle 错误代码
ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出 ...
- Oracle创建删除用户,角色,表空间,导入导出数据库命令总结(转载)
无意间看到一篇文章,觉得对于ORACLE的新手很实用,特转载,原文出处这里 说明:在创建数据库时输入的密码,是修改系统默认的密码,以system和sysman等系统默认身份登录时要输入的密码就是修改后 ...
- Oracle 错误码
Oracle作为一款比较优秀同时也比较难以掌握的大型数据库,在我们学习使用的过程中,不可避免的会遇到一些错误,为此 Oracle 给出了一套完备的错误消息提示机制 我们可以根据Oracle给出的消息提 ...
- oracle数据库-错误编码大全
ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-000 ...
随机推荐
- 第二章 Git
1.安装 这个就不必细说了 2.安装完后还要进行一步设置. 在命令行输入: git config --global user.name "Your Name" git config ...
- 【Linux-设备树】设备树
Linux3.1之前的版本,对于一般的ARM平台的设备,板级信息一般存放在/arch/arm/mach-**目录下. 设备树对应的文件存放在/arch/arm/boot/dts/***.dts目录下 ...
- 【ES6】迭代器与可迭代对象
ES6 新的数组方法.集合.for-of 循环.展开运算符(...)甚至异步编程都依赖于迭代器(Iterator )实现.本文会详解 ES6 的迭代器与生成器,并进一步挖掘可迭代对象的内部原理与使用方 ...
- 使用electron实现百度网盘悬浮窗口功能!
相关依赖 里面使用了vuex vue vue-route storeJs storeJs 用来持久化vuex状态 展示 介绍说明 没有使用electron内置的-webkit-app-region: ...
- C#修改电脑桌面图
win32helper public class Win32Helper { [DllImport("user32.dll", EntryPoint = "SystemP ...
- application session 实现简单的在线聊天人数的统计
写了快一年的asp.net,application对象还真没怎么用过.看了看书,根据这两个对象的特性写了一个简单的聊天室程序.真的是非常的简陋 ASP.Net中有两个重要的对象,一个是applicat ...
- scala学习笔记(7)
1.包 --------------------------------------- Scala中的包和Java或者C++中命名空间的目的是相同的:管理大型程序中的名称. package a{ pa ...
- freemarker如何在url中传递中文参数
例如:http://www.map512.cn/findPOI.do?key=南门如果不转码,request.getParameter("key")返回的是乱码,在jsp中,我们一 ...
- python基础知识的入门介绍
一.什么是编程语言 任何词语都是一种高度的概括和总结,所以找关键字.如下: (1)1.什么是"语言":一个人与另一个人沟通的介质 2人将自己的思维逻辑和想法通过计算机能过识别的语言 ...
- 软件工程大作业(学生会管理系统)Web端个人总结报告
软件工程大作业(学生会管理系统)Web端个人总结报告 一.小组信息 1.所在小组:第二组 2.小组选题:学生会管理系统 3.项目源代码链接: Web端源代码:code 小程序端源代码:code APP ...