2012-05-29 59 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的最高日期 –