总结: 关键的地方是where 语句的加入. 在11G中, 如果不加11G , 或造成除匹配的行数更新为相应的值之后, 其余的会变成负数.
所以, 测试的办法就是: 先查看需要更新的数量即连接的数量究竟有多少行, 然后update 之后多少行, 才能确定条件是否正确.
引入知识比较全面的地址:
本人用到的2处SQL:
1 :
UPDATE SFISM4.R_DT_DIP_TRACEABILITY_T B SET (B.CURRENT_QTY, B.UPDATE_TIME, B.UPDATE_USER)=(SELECT DECODE(SIGN(B.CURRENT_QTY - A.KP_COUNT),-1,0, B.CURRENT_QTY - A.KP_COUNT), SYSDATE,:VUSER FROM SFIS1.C_DT_DIP_BOM_T A, SFISM4.R_MO_BASE_T C WHERE A.BOM_NO = B.BOM_NO AND B.BOM_NO = C.KEY_PART_NO AND A.KEY_PART_NO = B.KEY_PART_NO AND C.MO_NUMBER =:VBOM AND B.TRAC_LOT =:VTRACELOT)WHERE B.TRAC_LOT =:VTRACELOT AND EXISTS (SELECT 1 FROM SFIS1.C_DT_DIP_BOM_T AA WHERE B.BOM_NO = AA.BOM_NO AND B.KEY_PART_NO = AA.KEY_PART_NO) UPDATE SFISM4.R_REEL_TRACKING_T A SET A.REMAIN_QTY =(SELECT B.REEL_QTY FROM SFISM4.R_MMS_STOCK_SMT_SA_DETAIL_T B WHERE A.REEL_ID = B.REEL_ID AND A.REMAIN_QTY <0 AND A.REMAIN_QTY <> B.REEL_QTY) WHERE EXISTS (SELECT 1 FROM SFISM4.R_MMS_STOCK_SMT_SA_DETAIL_T B WHERE A.REEL_ID = B.REEL_ID AND A.REMAIN_QTY <0 AND A.REMAIN_QTY <> B.REEL_QTY); UPDATE SFISM4.R_REEL_TRACKING_T A SET A.REMAIN_QTY =(SELECT B.REEL_QTY FROM SFISM4.R_MMS_STOCK_SMT_SA_DETAIL_T B WHERE A.REEL_ID = B.REEL_ID AND A.REMAIN_QTY <0 AND A.REMAIN_QTY <> B.REEL_QTY) WHERE EXISTS (SELECT 1 FROM SFISM4.R_MMS_STOCK_SMT_SA_DETAIL_T B WHERE A.REEL_ID = B.REEL_ID AND A.REMAIN_QTY <0 AND A.REMAIN_QTY <> B.REEL_QTY);SQL> select * from wwm2; --要更新的表 , 多一点.
原文:http://www.cnblogs.com/hijushen/p/4273929.html