Oracle
在 Oracle sql 中使用帶有子查詢的更新查詢
我有一個更新查詢,我正在嘗試更新一個欄位,但對於多個記錄,我正在嘗試連接,但它不起作用。下面我得到了從 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.html和https://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 );