Oracle

在 Oracle sql 中使用帶有子查詢的更新查詢

  • August 10, 2016

我有一個更新查詢,我正在嘗試更新一個欄位,但對於多個記錄,我正在嘗試連接,但它不起作用。下面我得到了從 select 語句返回的多個值,但我認為下面的語法不正確。

UPDATE sku@bn2 x 
INNER JOIN (
  select g.prev_perm_ret, g.itm_cd
  from gm_prc_reg_prc_items g, sku@bn2 b
  where g.itm_cd=b.stylecode
  and b.storecode=00000
  and g.prev_perm_ret<>b.listprice
  and g.prev_perm_ret>g.ret_prc
  and b.sellprice=b.listprice
) y ON x.stylecode=g.itm_cd
SET x.listprice=y.prev_perm_ret

我建議您在處理 oracle 時查看 merge into 語句。

如果您只想更新行省略語句的不匹配部分

請參閱http://www.oracle.com/webfolder/technetwork/de/community/apex/tipps/sql-merge/index.htmlhttps://docs.oracle.com/cd/B28359_01/server.111/b28286 /statements_9016.htm

我通常為此使用 PL/SQL 集合。本質上,您創建一個表類型,然後使用該表類型創建一個變數,然後執行 select for update 以獲取您要更新的所有數據,然後執行 forall update 以更新數據。由於您正在更新表,因此記錄類型應該是該表。如:

TYPE sku_tab_type IS TABLE OF sku@bn2%ROWTYPE
   INDEX BY PLS_INTEGER;
sku_table sku_tab_type;

然後執行 select for update 和 forall update a commit 就完成了。如果您需要,您可以在循環中使用限制子句載入數據,以便一次處理一小塊數據。我會首先嘗試一次更新所有數據。

http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html

這是我對有助於提高性能的兩個索引的最佳猜測。您可能需要使用和不使用這些索引進行測試,或者您可能已經有足夠的索引。

CREATE INDEX gm_prc_reg_prc_items_idx1 ON gm_prc_reg_prc_items_idx1 
    ( storecode, listprice, sellprice, stylecode );

CREATE INDEX sku_IDX@bn2 ON sku@bn2
    ( prev_perm_ret, ret_prc, itm_cd );

引用自:https://dba.stackexchange.com/questions/84517