2016-01-26 93 views
0

我想更新大表TEMP_MA_CONTACT我用MERGE INTOSQL如何避免ora-38104?

MERGE INTO TEMP_MA_CONTACT C 
USING (select * from TABLE_TO_CHANGE_2601) T 
ON (C.CUSTOMER_RK = T.CUSTOMER_RK) 
WHEN MATCHED THEN UPDATE SET C.CUSTOMER_RK = T.NEW_CUSTOMER_RK 

但甲骨文說:

ORA-38104: Columns referenced in the ON Clause cannot be updated 
+0

你不需要'merge'可言。您正在將列設置爲已具有的值。 –

回答

1

來解決這個問題的最好的變體是:

1)首先將rowid添加到table_to_change_2601

CREATE TABLE table_to_change_2601_new AS 
SELECT T.*, 
I.ROWID AS ROW_ID FROM 
     table_to_change_2601 T JOIN temp_ma_contact I ON T.CUSTOMER_RK = I.CUSTOMER_RK 
012在

2)合併該ROWID的

MERGE INTO temp_ma_contact C 
USING (select * from table_to_change_2601_new) T 
ON (C.ROWID = T.ROW_ID) 
WHEN MATCHED THEN UPDATE SET C.CUSTOMER_RK = T.NEW_CUSTOMER_RK 
1

嗯,我不知道是否有可能與合併..但是你可以始終使用更新使用子查詢:

UPDATE TEMP_MA_CONTACT C 
set c.customer_rk = 
(select P.new_customer_rk from table_to_change_2601 p where P.customer_rk = C.customer_rk) 

另一個想法是這樣的:

ALTER TABLE TEMP_MA_CONTACT add TEMP_COL NUMBER(5); 
UPDATE TEMP_MA_CONTACT set TEMP_COL = customer_rk; 

,然後使用原來的合併,但此列是這樣的:

MERGE INTO TEMP_MA_CONTACT C 
USING (select * from TABLE_TO_CHANGE_2601) T 
ON (C.TEMP_COLUMN = T.CUSTOMER_RK) 
WHEN MATCHED THEN UPDATE SET C.CUSTOMER_RK = T.NEW_CUSTOMER_RK; 
commit; 

,然後滴速列

ALTER TABLE TEMP_MA_CONTACT drop column TEMP_COLUMN 
+0

是的,但它會很慢 – Jdzel

+0

你會考慮添加一個列ID列的精確副本,比較它,然後刪除列? @Jdzel用我的建議編輯我的回答 – sagi

+0

@Jdzel:你認爲UPDATE會比MERGE慢嗎?兩人都在進行相同的工作。 –