我有两个表,表示Table1和Table2,它包含我应该加入的以下列,并使用表2中相同列的值执行Table1列的更新。
加入条件的列:
要更新的栏目:
Table1.dtofhire = Table2.dtofhire
我需要一种方法来批量更新(使用单个更新查询而不循环)Oracle 11G中的上述列。
Table1不包含任何指定的键约束,因为它将用作数据上载的临时表。
请帮我更新一下。
答案 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 );