2012-05-29 90 views
0

我有兩個表格,分別爲Table1和Table2,它們包含我應該加入的以下列,並使用表格2中存在的同一列的值執行Table1的列更新。批量更新Oracle中的列11G

欄目的加盟條件:

  1. Table1.mem_ssn和Table2.ins_ssn
  2. Table1.sys_id和Table2.sys_id
  3. Table1.grp_id和Table2.grp_id

列到更新:

Table1.dtofhire = Table2.dtofhire

我需要一種批量更新(使用單個更新查詢而不循環)Oracle 11G中的上述列。

表1不包含任何指定的密鑰約束,因爲它將用作數據上載的登臺表。

請幫助我更新相同。

回答

0

,我曾經到達的功能的查詢看到下面

UPDATE table1 T2 
SET dtofhire = (SELECT Max(dtofhire) AS dtofhire 
      FROM table2 T1 
      WHERE T2.mem_ssn = T1.ins_ssn 
       AND T2.sys_id = T1.sys_id 
       AND T2.grp_id = T1.grp_id 
      GROUP BY ins_ssn, 
       sys_id, 
       grp_id) 
WHERE (mem_ssn, sys_id, grp_id) IN (SELECT ins_ssn, 
         sys_id, 
         grp_id 
        FROM table2); 
+0

這將是一個稍慢一點,並容易出錯的「IN」。 「IN」設置中的高平等檢查和限制。更好的方法是@ A.B.Cade的 – Pappu

2

您可以使用MERGE語句。
它應該是這個樣子:

MERGE INTO table1 D 
    USING (SELECT * FROM table2) S 
    ON (D.mem_ssn = S.ins_ssn and D.sys_id = S.sys_id and D.grp_id=S.grp_id) 
    WHEN MATCHED THEN 
    UPDATE SET D.dtofhire=S.dtofhire; 

UPDATE:
既然你用相同(ins_ssn,sys_id,grp_id)表2多行,你想最大dtofhire,你應該更改查詢的使用條款中:

MERGE INTO table1 D 
    USING (SELECT ins_ssn, sys_id, grp_id, max(dtofhire) m_dtofhire 
      FROM table2 
     GROUP BY ins_ssn,sys_id,grp_id) S 
    ON (D.mem_ssn = S.ins_ssn and D.sys_id = S.sys_id and D.grp_id=S.grp_id) 
    WHEN MATCHED THEN 
    UPDATE SET D.dtofhire=S.m_dtofhire; 
+0

感謝Cade,但出現以下錯誤:ORA-30926:無法在源表中獲得一組穩定的行 –

+0

您在table2中有多於一行(ins_ssn,sys_id,grp_id)嗎? –

+0

是的凱德我從表2中獲取了多於一行的查詢。爲此,我要更新2012年5月2日05/02/2012和05/03/1999的最高日期 –