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分析函数筛选其一加以更新即可。

  • 相关阅读:
    KnockoutJS 3.X API 第五章 高级应用(4) 自定义处理逻辑
    KnockoutJS 3.X API 第五章 高级应用(3) 虚拟元素绑定
    KnockoutJS 3.X API 第五章 高级应用(2) 控制后代绑定
    KnockoutJS 3.X API 第五章 高级应用(1) 创建自定义绑定
    KnockoutJS 3.X API 第四章(14) 绑定语法细节
    KnockoutJS 3.X API 第四章(13) template绑定
    KnockoutJS 3.X API 第四章 表单绑定(12) selectedOptions、uniqueName绑定
    KnockoutJS 3.X API 第四章 表单绑定(11) options绑定
    KnockoutJS 3.X API 第四章 表单绑定(10) textInput、hasFocus、checked绑定
    KnockoutJS 3.X API 第四章 表单绑定(9) value绑定
  • 原文地址:https://www.cnblogs.com/guipeng/p/6483033.html
Copyright © 2011-2022 走看看