Merge 在Oracle 11G中批量更新列
我有两个表,分别是Table1和Table2,其中包含以下列,我应该将它们连接起来,并使用Table2中相同列的值更新Table1的一列 连接条件的列: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不包含任何指定的键约束,因为它将用作数据上载的暂存
它应该是这样的:
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