基于emp_source表实现emp_des表的INSERT/UPDATE/DELETE操作求助
分场景处理目标表的更新与删除标记
一、处理源表更新的记录
你之前的UPDATE导致全表标识变'U',核心问题是没加精准的关联和过滤条件。要只更新源表中已修改的对应目标记录,用JOIN关联两张表的ID(假设ID是唯一主键),再过滤出字段有变化的行:
UPDATE emp_des d JOIN emp_source s ON d.ID = s.ID SET d.DESIG = s.DESIG, d.NAME = s.NAME, -- 如果NAME也可能被修改则保留,否则删除此行 d.META_UPD_DT = CURRENT_TIMESTAMP, -- 替换为对应数据库的时间函数,比如SQL Server用GETDATE() d.META_IUD_FLG = 'U' WHERE -- 只更新实际有变化的记录,避免无意义操作 d.DESIG <> s.DESIG OR d.NAME <> s.NAME; -- 同上,不需要则删除此行
二、处理源表删除的记录
要标记目标表中源表已不存在的记录,用NOT EXISTS筛选出这些行,再更新元数据字段:
UPDATE emp_des d SET d.META_UPD_DT = CURRENT_TIMESTAMP, d.META_IUD_FLG = 'D', d.CURRENT_FLAG = FALSE WHERE NOT EXISTS (SELECT 1 FROM emp_source s WHERE s.ID = d.ID) AND d.CURRENT_FLAG = TRUE; -- 只处理当前有效的记录,避免重复标记
新手必备注意事项
- 先查后更:执行UPDATE前,先用SELECT验证要修改的行,比如:
-- 验证要更新的源表修改记录 SELECT d.*, s.DESIG AS new_desig FROM emp_des d JOIN emp_source s ON d.ID=s.ID WHERE d.DESIG <> s.DESIG; - 主键关联:必须用唯一标识(比如ID)关联两张表,否则会误更新无关行
- 时间函数适配:不同数据库的当前时间函数不同,比如Oracle用
SYSTIMESTAMP,按需替换
内容的提问来源于stack exchange,提问作者TrenT
相关产品推荐
相关产品推荐

