Merge 在Oracle 11G中批量更新列

Merge 在Oracle 11G中批量更新列,merge,oracle11g,bulk,Merge,Oracle11g,Bulk,我有两个表,分别是Table1和Table2,其中包含以下列,我应该将它们连接起来,并使用Table2中相同列的值更新Table1的一列 连接条件的列: 表1.mem\U ssn和表2.ins\U ssn 表1.sys\u id和表2.sys\u id 表1.grp\U id和表2.grp\U id 要更新的列: 表1.dtof HER=表2.dtof HER 我需要一种在Oracle11g中批量更新(使用单个更新查询而不循环)上述列的方法 表1不包含任何指定的键约束,因为它将用作数据上载的暂存

我有两个表,分别是Table1和Table2,其中包含以下列,我应该将它们连接起来,并使用Table2中相同列的值更新Table1的一列

连接条件的列:

  • 表1.mem\U ssn和表2.ins\U ssn
  • 表1.sys\u id和表2.sys\u id
  • 表1.grp\U id和表2.grp\U id
  • 要更新的列:

    表1.dtof HER=表2.dtof HER

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

    表1不包含任何指定的键约束,因为它将用作数据上载的暂存表

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

    您可以使用该语句。
    它应该是这样的:

    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;
    
    更新:
    由于表2中有多行具有相同的(ins\U ssn、sys\U id、grp\U id),并且您需要其的max
    dth,因此应在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;
    

    我用来获取该功能的查询如下所示

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

    感谢Cade,但出现以下错误:ORA-30926:无法在源表中获得一组稳定的行。表2中是否有多行具有相同的行(ins\U ssn、sys\U id、grp\U id)?是的Cade我从表2中检索了多行用于查询。为此,我将更新最高日期,如2012年2月5日和1999年3月5日的2012年2月5日。感谢Cade的回复。。我确实找到了一种更新Sameth的方法,这将是一个稍微慢一点的方法,并且容易出错。“in”集合中的高相等性检查和限制。更好的方法是@A.B.Cade's