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

  • 相关阅读:
    全排列问题(内测第0届第1题)
    提取字符串中的数字(C语言)
    尾递归=递归+迭代?
    Android各版本代号、版本号、API/NDK级别、发布时间及市场份额
    C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析
    sizeof既是关键字,又是运算符(操作符),但不是函数!
    探寻main函数的“标准”写法,以及获取main函数的参数、返回值
    Scala比较器:Ordered与Ordering
    【Python实战】Pandas:让你像写SQL一样做数据分析(一)
    【Python实战】Scrapy豌豆荚应用市场爬虫
  • 原文地址:https://www.cnblogs.com/guipeng/p/6483033.html
Copyright © 2011-2022 走看看