zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    无法导入panda包解决方法
    VUE学习笔记——基础标签,函数
    jobs指令man手册内容
    linux 部分参数的全名
    bilibiliUP数据爬取——requests库与jason库运用实例
    宝塔面板无法进入phpadmin管理数据库解决办法
    python-spider_BeautifulSoup入门实践(一)安装以及简单的抓取数据
    c++程序设计实践——银行系统
    opencv-学习笔记
    关于pipeline的一篇转载博文https://www.cnblogs.com/midhillzhou/p/5588958.html
  • 原文地址:https://www.cnblogs.com/tdskee/p/11397878.html
Copyright © 2011-2022 走看看