ORA-30926: unable to get a stable set of rows in the source tables

Oracle 中用一个表的数据更新另一个表的数据


最好的方法是用merge语法:
  1. merge into tab1  
  2. using tab2  
  3. on(tab1.id=tab2.id)  
  4. when matched then  
  5. update set tab1.val = tab2.val  
同样,如果tab2中有多条对应tab1中一条的情况会出错:ORA-30926: unable to get a stable set of rows in the source tables
比如在tab2中再插入一条 insert into tab2 values(2,'xxxx')

可以通过在using中的subquery中将重复记录过滤来避免这种错误,

merge:

  1. merge into tab1  
  2. using  (select * FROM tab2 X  WHERE  X.ROWID =  
  3. (SELECT MAX(Y.ROWID) FROM  tab2 Y  WHERE  X.ID = Y.ID)) tab2  
  4. on(tab1.id=tab2.id)  
  5. when matched then  
  6. update set tab1.val = tab2.val 

但是考虑到关联查询效率问题,可以使用oracle分析函数去重后merge

    MERGE INTO YTRPT.T_EXP_CHECK_STATION P
    USING (SELECT ORG_CODE, WAYBILL_NO
             FROM (SELECT K.ORG_CODE,
                          K.WAYBILL_NO,
                          ROW_NUMBER() OVER(PARTITION BY K.WAYBILL_NO ORDER BY K.CREATE_TIME DESC) AS RW --去除重复取出最新的那条记录,否则merge会出错
                     FROM YTEXP.T_EXP_OP_RECORD_HANDON K
                    WHERE K.CREATE_TIME >= P_START_TIME
                      AND K.CREATE_TIME < P_END_TIME + 10
                      AND K.OP_CODE IN ('710', '711') --派件扫描
                      AND K.STATUS > 0
                      AND K.AUX_OP_CODE <> 'DELETE')
            WHERE RW = 1) TEMP
    
    ON (P.WAYBILL_NO = TEMP.WAYBILL_NO AND P.RPT_DATE = P_START_TIME)
    WHEN MATCHED THEN
      UPDATE SET P.SIG_ORG_CODE = TEMP.ORG_CODE;

阅读更多
版权声明:作者:言蹊的专栏 出处:https://blog.csdn.net/andy_wcl 本文版权归作者和csdb共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。 如果您认为这篇文章还不错或者有所收获,可以点击左边栏的按钮【点赞】,谢谢! https://blog.csdn.net/andy_wcl/article/details/8875040
上一篇[转] Merge into的使用详解-你Merge了没有
下一篇Oracle Minus关键字
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭