2017-06-27 75 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