求助:将指定date_value行字段更新为前一周对应行的字段值
解决批量更新前一周对应行数据的问题
看起来你是想把特定日期(8-JAN-2018)且effective_dt为NULL的行,用前一周(01-JAN-2018)对应主体的RACF_ID和SUPV_RACF值来更新,用游标确实有点繁琐,试试下面更高效的SQL写法,应该能解决你的问题:
方法1:使用UPDATE关联子查询
这种写法直接关联目标表和数据源表,精准定位要更新的行:
UPDATE temp_join tgt SET (RACF_ID, SUPV_RACF) = ( SELECT src.RACF_ID, src.SUPV_RACF FROM temp_join src WHERE src.date_value = tgt.date_value - 7 -- 这里替换成你的表中用来关联同主体的列,比如员工ID、唯一标识ID AND src.emp_id = tgt.emp_id ) WHERE tgt.date_value = '8-JAN-2018' AND tgt.effective_dt IS NULL -- 确保前一周有对应数据,避免更新为NULL AND EXISTS ( SELECT 1 FROM temp_join src WHERE src.date_value = tgt.date_value - 7 AND src.emp_id = tgt.emp_id );
关键说明:
tgt是目标行的别名,src是前一周数据源行的别名- 必须加上
src.emp_id = tgt.emp_id这类关联条件,否则会把所有前一周的行数据随机更新到目标行里,这肯定不是你想要的 EXISTS子句用来过滤掉那些前一周没有对应数据的行,防止它们的RACF_ID和SUPV_RACF被更新为NULL
方法2:使用MERGE语句(适合复杂匹配场景)
如果你的更新逻辑后续可能扩展,MERGE语句会更灵活:
MERGE INTO temp_join tgt USING ( -- 先筛选出前一周的数据源数据 SELECT emp_id, RACF_ID, SUPV_RACF FROM temp_join WHERE date_value = '01-JAN-2018' ) src ON ( -- 匹配条件:同主体、目标日期是数据源日期+7、目标行effective_dt为NULL tgt.emp_id = src.emp_id AND tgt.date_value = src.date_value + 7 AND tgt.effective_dt IS NULL ) WHEN MATCHED THEN UPDATE SET tgt.RACF_ID = src.RACF_ID, tgt.SUPV_RACF = src.SUPV_RACF;
执行前验证数据
建议先运行下面的查询,确认要更新的行和对应的新值是否正确,避免误操作:
SELECT tgt.date_value AS target_date, tgt.RACF_ID AS old_racf, src.RACF_ID AS new_racf, tgt.SUPV_RACF AS old_supv, src.SUPV_RACF AS new_supv FROM temp_join tgt LEFT JOIN temp_join src ON src.date_value = tgt.date_value -7 AND src.emp_id = tgt.emp_id WHERE tgt.date_value = '8-JAN-2018' AND tgt.effective_dt IS NULL;
内容的提问来源于stack exchange,提问作者Pratik Fouzdar
相关产品推荐
相关产品推荐

