2012-08-14 87 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

相關問題