批量更新Oracle 11G中的列

时间:2012-05-29 12:32:38

标签: merge oracle11g bulk

我有两个表,表示Table1和Table2,它包含我应该加入的以下列,并使用表2中相同列的值执行Table1列的更新。

加入条件的列:

  1. Table1.mem_ssn和Table2.ins_ssn
  2. Table1.sys_id和Table2.sys_id
  3. Table1.grp_id和Table2.grp_id
  4. 要更新的栏目:

    Table1.dtofhire = Table2.dtofhire

    我需要一种方法来批量更新(使用单个更新查询而不循环)Oracle 11G中的上述列。

    Table1不包含任何指定的键约束,因为它将用作数据上载的临时表。

    请帮我更新一下。

2 个答案:

答案 0 :(得分: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;

<强>更新
由于table2中有多行具有相同的(ins_ssn,sys_id,grp_id),并且您需要max dtofhire,因此应该在using子句中更改查询:

 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;

答案 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 );