0

我有两个表,说 Table1 和 Table2,其中包含以下列,我应该加入并使用 Table2 中存在的同一列的值执行更新 Table1 的列。

加入条件的列:

  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 中批量更新(使用单个更新查询而不循环)上述列的方法。

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

请帮助我更新相同的内容。

4

2 回答 2

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;
于 2012-05-29T13:35:12.313 回答
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 );
于 2012-05-30T13:38:02.280 回答