2013-08-07 43 views
2

我有兩個MANUAL_TRANSACTIONS和MANUAL_LIST_TEMP表。我想要實現的是使用MANUAL_LIST_TEMP中的信息更新MANUAL_TRANSACTIONS。這裏只有MANUAL_LIST_TEMP表中存在的記錄應更新爲MANUAL_TRANSACTIONS。用INNER加入更新查詢

我已經做了類似於下面的事情,但以下語句的問題是它更新MANUAL_TRANSACTIONS表中的每條記錄。

UPDATE MANUAL_TRANSACTIONS 
SET ("Age", "Assigned_To", "Attachments", "Comments", "Completed_Date_Time" 
, "Content_Type", "Created", "Created_By","Cycle_Time (Crt to Complete)" 
, "Cycle_Time (First reply)", "DISTRIBUTION_CHANNEL")= 
     (SELECT MANUAL_LIST_TEMP."Age", MANUAL_LIST_TEMP."Assigned_To", 
     MANUAL_LIST_TEMP."Attachments", MANUAL_LIST_TEMP."Comments", 
     MANUAL_LIST_TEMP."Completed_Date_Time", MANUAL_LIST_TEMP."Content_Type", 
     MANUAL_LIST_TEMP."Created", MANUAL_LIST_TEMP."Created_By", 
     MANUAL_LIST_TEMP."Cycle_Time (Crt to Complete)", 
     MANUAL_LIST_TEMP."Cycle_Time (First reply)", 
     MANUAL_LIST_TEMP."Distribution_Channel" 
     FROM MANUAL_LIST_TEMP 
     WHERE MANUAL_LIST_TEMP.ID = MANUAL_TRANSACTIONS.ID) 

回答

3

你也應該在WHERE子句添加到您的UPDATE語句:

UPDATE MANUAL_TRANSACTIONS 
SET ("Age", "Assigned_To", "Attachments", "Comments", "Completed_Date_Time" 
, "Content_Type", "Created", "Created_By","Cycle_Time (Crt to Complete)" 
, "Cycle_Time (First reply)", "DISTRIBUTION_CHANNEL")= 
     (SELECT MANUAL_LIST_TEMP."Age", MANUAL_LIST_TEMP."Assigned_To", 
     MANUAL_LIST_TEMP."Attachments", MANUAL_LIST_TEMP."Comments", 
     MANUAL_LIST_TEMP."Completed_Date_Time", MANUAL_LIST_TEMP."Content_Type", 
     MANUAL_LIST_TEMP."Created", MANUAL_LIST_TEMP."Created_By", 
     MANUAL_LIST_TEMP."Cycle_Time (Crt to Complete)", 
     MANUAL_LIST_TEMP."Cycle_Time (First reply)", 
     MANUAL_LIST_TEMP."Distribution_Channel" 
     FROM MANUAL_LIST_TEMP 
     WHERE MANUAL_LIST_TEMP.ID = MANUAL_TRANSACTIONS.ID) 
WHERE MANUAL_TRANSACTIONS.ID IN (SELECT MANUAL_LIST_TEMP.ID FROM MANUAL_LIST_TEMP); 

爲了達到最佳效果,將您的UPDATE轉換爲MERGE語句:

MERGE INTO MANUAL_TRANSACTIONS tgt 
USING (
     SELECT MANUAL_LIST_TEMP.ID, 
     MANUAL_LIST_TEMP."Age", MANUAL_LIST_TEMP."Assigned_To", 
     MANUAL_LIST_TEMP."Attachments", MANUAL_LIST_TEMP."Comments", 
     MANUAL_LIST_TEMP."Completed_Date_Time", MANUAL_LIST_TEMP."Content_Type", 
     MANUAL_LIST_TEMP."Created", MANUAL_LIST_TEMP."Created_By", 
     MANUAL_LIST_TEMP."Cycle_Time (Crt to Complete)", 
     MANUAL_LIST_TEMP."Cycle_Time (First reply)", 
     MANUAL_LIST_TEMP."Distribution_Channel" 
     FROM MANUAL_LIST_TEMP 
) src 
ON (tgt.ID = src.ID) 
WHEN MATCHED THEN UPDATE 
SET tgt."Age" = src."Age" 
    , tgt."Assigned_To" = src."Assigned_To" 
    [...] 

MERGE語句將僅更新在MANUAL_TRANSACTIONS行(該目標表),其具有在MANUAL_LIST_TEMP(所述表)匹配的行。

+0

感謝Danilo ..也可以告訴我,如果我使用更新語句,而不是合併,它會導致任何問題,如性能問題? – santhosha

+1

MERGE語句通常應該表現得更好,特別是對於大量的記錄。更新應該很好。一如既往,嘗試兩種方法並找出答案! –

0

試試這個

UPDATE MANUAL_TRANSACTIONS 
    Set Age = MANUAL_LIST_TEMP.AGE, .... 
    From MANUAL_TRANSACTIONS 
    inner join MANUAL_LIST_TEMP on MANUAL_LIST_TEMP.ID = MANUAL_TRANSACTIONS.ID 
+2

這是否會甚至工作?根據http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx和http://docs.oracle.com/cd/E11882_01/server.112 /e26088/statements_10008.htm#i2112182,它不應該。 –

+0

是的,它在SQL中工作正常 – Harshil

+0

這在Oracle中不起作用。 –

1

你需要一個更加其中FOR UPDATE子句

0
UPDATE MANUAL_TRANSACTIONS mt 
    left join MANUAL_LIST_TEMP mlt 
    on mt.ID = mlt.ID set mt.Age=mlt.Age ..... 
+0

這是否會工作?根據http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx和http://docs.oracle.com/cd/E11882_01/server.112 /e26088/statements_10008.htm#i2112182,它不應該。 –

+0

是的,這將工作,你可以在這裏檢查http://stackoverflow.com/questions/3248531/mysql-update-query-using-a-left-join – Anurag

+0

鏈接的問題是關於MySQL。這個問題是關於Oracle的。 –

0

請試試這個:

UPDATE MANUAL_TRANSACTIONS mt INNER JOIN MANUAL_LIST_TEMP mlt 
on mt.ID = mlt.ID set mt.Age=mlt.Age,mt.Assigned_To=mlt.Assigned_To, .....;