2017-06-27 109 views
0

所以,我有我試圖改變成一個INSERT插入不返回正確價值觀

這裏有更新的原始更新語句(它需要長期進行大批量生產)

DECLARE 
    BEGIN 
     UPDATE TOCTASK_ORIG TASKO 
      SET c_ocactvty_childactiviti = 11200, 
       i_ocactvty_childactiviti = 
       (SELECT PROI.I 
       FROM TOCPROCESSINSTANCE PROI, 
        TOCSERVICEREQUEST SR 
       WHERE TASKO.c_occontbs_tasks = 11011 
        AND TASKO.i_occontbs_tasks = SR.I 
        AND PROI.C_PROCESSIServiceRe = SR.C 
        AND PROI.I_PROCESSIServiceRe = SR.I 
       ) 
      WHERE EXISTS 
         (SELECT 1 
         FROM TOCPROCESSINSTANCE PROI, 
          TOCSERVICEREQUEST SR 
         WHERE TASK.c_occontbs_tasks = 11011 
          AND TASK.i_occontbs_tasks = SR.I 
          AND PROI.C_PROCESSIServiceRe = SR.C 
          AND PROI.I_PROCESSIServiceRe = SR.I 
         ); 
     COMMIT; 
    END; 

從研究網上最好的辦法是改寫這個可以插入,使沿我在這裏做的方式

的變化是爲INSERT

SELECT子句0

問題是我目前在原始表中有110302條記錄,但是當我將插入運行到一個新的臨時表時,它只創建了19,269條記錄。這個數字相匹配的WHERE子句中,19,269現在應該匹配PROI.I值的第二部分,其餘部分爲空

AND PROI.C_PROCESSIServiceRe = 11011 
AND PROI.I_PROCESSIServiceRe = SR.I 

問題是正在創建沒有其他記錄,它只是簡單地創建了19,269記錄和停止

任何幫助將是巨大的

+0

以上信息:寫INNER JOIN逗號istead。它的ANSI標準,將更容易爲您和所有其他人閱讀 –

回答

0

之所以能夠弄清楚基於一些爲未來提供

FROM TOCTASK_ORIG TASKO 
LEFT OUTER JOIN TOCSERVICEREQUEST SR 
ON TASKO.c_occontbs_tasks = SR.C 
    AND TASKO.i_occontbs_tasks = SR.I 
LEFT OUTER JOIN TOCPROCESSINSTANCE PROI 
ON PROI.C_PROCESSIServiceRe = SR.C 
    AND PROI.I_PROCESSIServiceRe = SR.I; 
0

如果看到,當前正在執行INNER JOIN,因此只匹配的行出現。而你實際上需要執行LEFT OUTER JOIN

FROM TOCTASK_ORIG TASKO 
LEFT JOIN  TOCSERVICEREQUEST SR ON TASKO.i_occontbs_tasks = SR.I 
LEFT JOIN TOCPROCESSINSTANCE PROI ON PROI.I_PROCESSIServiceRe = SR.I 
AND PROI.C_PROCESSIServiceRe = 11011 
WHERE TASKO.c_occontbs_tasks = 11011; 
+0

這樣做只返回19,316行,仍然不是110302 – Jamiex304

+0

您需要刪除where子句並在選擇列表中使用case語句來確定哪些值使用 - 即原始或更改後的值 – Boneist