使用另一个表中的值更新Oracle表

时间:2012-08-14 23:53:43

标签: oracle11g

我有两个表ORDERS和ORDER_TEMP,两者结构相同。 ORDER_ID是两个表中的主键。

现在,我必须从ORDER_TEMP表中的值更新ORDER表中的KEY_ID列。

两个表中都有超过百万条记录。

UPDATE ORDER  
SET KEY_ID = ( SELECT KEY_ID FROM ORDER_TEMP WHERE  ORDER_TEMP.ORDER_ID = ORDER.ORDER_ID and ORDER_TEMP.PNP_GROUP=99) 

如果我在ORDER表上放置一个where子句并为一个订单运行它确实有效,但是当我为整个表执行时它会永远运行并且它不起作用。

请帮忙

1 个答案:

答案 0 :(得分:1)

假设您的目的是仅更新ORDER表中ORDER_TEMP表中匹配且KEY_ID不同的行,而忽略ORDER不同的行{1}}是一个无效的表名,我首先要确保您只更新表中预期修改的行数少于20%

UPDATE ORDER  
   SET KEY_ID = ( SELECT KEY_ID 
                    FROM ORDER_TEMP 
                   WHERE ORDER_TEMP.ORDER_ID = ORDER.ORDER_ID 
                     and ORDER_TEMP.PNP_GROUP=99) 
 WHERE EXISTS( SELECT 1
                 FROM order_temp
                WHERE ORDER_TEMP.ORDER_ID = ORDER.ORDER_ID 
                  and ORDER_TEMP.PNP_GROUP=99
                  and order_temp.key_id != order.key_id) 

如果两个表中的KEY_ID都为NULL,则需要调整EXISTS子句中的不等式比较。

如果这不能解决问题,我们需要从当前查询计划和可用索引开始的更多信息。