2013-08-07 42 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, .....;