2011-10-27 15 views
36

更新許多行根據各等於(USER_ID)一列到一個表從另一個表基於一列。更新的行與另一個表中的各條件相同的

這兩個表都有一個user_id列。當user_id列相同時,需要將t2中的數據插入t1

預先感謝您提供的任何幫助。

+0

Upvoted。請參閱相關問題:http://stackoverflow.com/q/7030699/435605 –

回答

49
update 
    table1 t1 
set 
    (
    t1.column1, 
    t1.column2 
    ) = (
    select 
     t2.column1, 
     t2.column2 
    from 
     table2 t2 
    where 
     t2.column1 = t1.column1 
    ) 
    where exists (
     select 
     null 
     from 
     table2 t2 
     where 
     t2.column1 = t1.column1 
    ); 

還是這個(如果t2.column1 < => t1.column1是多對一和他們中的任何一個是好的):

update 
    table1 t1 
set 
    (
    t1.column1, 
    t1.column2 
    ) = (
    select 
     t2.column1, 
     t2.column2 
    from 
     table2 t2 
    where 
     t2.column1 = t1.column1 
    and 
     rownum = 1  
    ) 
    where exists (
     select 
     null 
     from 
     table2 t2 
     where 
     t2.column1 = t1.column1 
    ); 
+0

非常感謝。在修正數據以消除重複之後,它就像一個魅力一樣! – JcR49

+0

這個答案是正確的,非常有幫助。謝謝。 – JcR49

+0

@JohnRose,不客氣! –

25

如果您想更新從T2與數據T1匹配的行,則:

update t1 
set (c1, c2, c3) = 
(select c1, c2, c3 from t2 
where t2.user_id = t1.user_id) 
where exists 
(select * from t2 
where t2.user_id = t1.user_id) 

「在哪裏存在」部分,以防止更新T1列空在那裏不存在匹配。

+1

謝謝。就像我試過的其他查詢一樣,這會返回'單行查詢rturns許多行'..不會插入/更新任何內容。 – JcR49

+0

有近千行需要更新....... – JcR49

+1

那麼user_id在t1中不是唯一的嗎?在那種情況下,你怎麼知道**哪個** t1得到的值? –

5

如果記錄已經存在於t1中(user_id匹配),那麼這不是插入,除非您很樂意創建重複的user_id。

您可能想要更新嗎?

UPDATE t1 
    SET <t1.col_list> = (SELECT <t2.col_list> 
          FROM t2 
         WHERE t2.user_id = t1.user_id) 
WHERE EXISTS 
     (SELECT 1 
     FROM t2 
     WHERE t1.user_id = t2.user_id); 

希望它可以幫助...

+0

ORA-01427:單行子查詢返回多個行 – JcR49

+0

我繼續回到同一個ORA 01427單行查詢返回多行。 – JcR49

+0

如果關係不是一對一,你將得到一個ORA-01427錯誤。這意味着您的equijoin語句無法成功匹配表1中的一條記錄到表2中的一條記錄。 – Nathan

14
merge into t2 t2 
using (select * from t1) t1 
on (t2.user_id = t1.user_id) 
when matched then update 
set 
    t2.c1 = t1.c1 
, t2.c2 = t1.c2 
2

您可以隨時使用並省略「未匹配部分」

merge into table1 FromTable 
    using table2 ToTable 
    on  (FromTable.field1 = ToTable.field1 
      and FromTable.field2 =ToTable.field2) 
when Matched then 
update set 
    ToTable.fieldr = FromTable.fieldx, 
    ToTable.fields = FromTable.fieldy, 
    ToTable.fieldt = FromTable.fieldz) 
when not matched then 
    insert (ToTable.field1, 
     ToTable.field2, 
     ToTable.fieldr, 
     ToTable.fields, 
     ToTable.fieldt) 
    values (FromTable.field1, 
     FromTable.field2, 
     FromTable.fieldx, 
     FromTable.fieldy, 
     FromTable.fieldz); 
相關問題