zoukankan      html  css  js  c++  java
  • 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分析函数筛选其一加以更新即可。

  • 相关阅读:
    常用JQuery插件整理
    SSL为Windows server 2008 IIS7进行加密连接
    使用SVN+CruiseControl+ANT实现持续集成之一
    持续化集成工具CruiseControl.NET
    用Asp.net写自己的服务框架
    使用CruiseControl+SVN+ANT实现持续集成之三
    CSLA学习之控制菜单可见性
    Oracle 动态SQL语句(3)之保存存储过程
    Oracle数据库编程之Float与Double
    当函数需要传入较多的参数,可分装成结构体
  • 原文地址:https://www.cnblogs.com/guipeng/p/6483033.html
Copyright © 2011-2022 走看看