2012-08-14 85 views
0

我有两个表ORDERS和ORDER_TEMP,两者在结构上相同。 ORDER_ID是这两个表中的主键。使用另一个表中的值更新Oracle表

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

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

如果我把where子句中的ORDER表并运行它没有工作一个订单,但如果我做了它运行下去整个表,并没有奏效。

请帮

+0

“没有工作”是否意味着有错误?或者你只是厌倦了等待查询完成?如果没有错误并且这只是查询性能问题,那么查询计划是什么?哪些索引可用?在放弃之前等待查询运行了多久?你正在更新ORDER表中的哪一行? – 2012-08-15 00:03:33

+0

花了超过45分钟,在我放弃之前仍在处理中。我正在尝试更新订单表中的200,000条记录。这两个表格都有索引。 – acadia 2012-08-15 00:06:02

+0

什么是查询计划?哪些索引可用?在ORDER表中定义了什么触发器?既然你没有'WHERE'子句,你的查询会更新'ORDER'表中的每一行 - 我假设你说的是你真的想更新少于20%的行,对吧?正如所写的,'UPDATE'语句将'ORDER_TEMP'中没有匹配行的'ORDER'中的任何一行的'KEY_ID'设置为'NULL'。我认为这不是你所希望的? – 2012-08-15 00:14:30

回答

1

假设你的意图是只更新ORDER表中的行,其中有在ORDER_TEMP表匹配以及其中KEY_ID是不同的,而忽略了一个事实,即ORDER是无效的表名,我会先从确保您只更新表,你希望修改

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) 

行的不到20%,如果KEY_ID可以在两个表是NULL,你需要ŧ o调整EXISTS子句中的不等式比较。

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

+0

这是一个好的开始,但是我们确实需要更多的信息来确保我们给出了正确的答案。最好在子查询中不要有两列,因为即使你只选择了1个索引,从第一个索引的结果中搜索第二个索引,这会减慢速度。 – FlyingGuy 2015-02-08 19:07:29

相关问题