Oracle SQL使用LAG函数执行UPDATE结果全为NULL问题求助
问题根因
你的UPDATE语句中,子查询通过B.START_DATE=A.START_DATE过滤后,每次仅返回单条匹配数据,窗口函数LAG在仅含单行的结果集中无法取到上一行数据,因此所有返回值均为NULL。此外你当前的UPDATE语句误操作了RESPONSE字段,按照需求你应该更新的是FINAL_TREND字段。
解决方案
Oracle 中可以通过两种常用方案实现该更新需求:
方案1:使用MERGE语句(兼容性最优)
MERGE语句先全表计算好所有行的上一行RESPONSE值,再关联原表批量更新,不会出现单行计算的问题:
MERGE INTO DUMMY_YC tgt USING ( SELECT ID, START_DATE, LAG(RESPONSE, 1) OVER (ORDER BY START_DATE) AS prev_response FROM DUMMY_YC ) src ON (tgt.ID = src.ID AND tgt.START_DATE = src.START_DATE) WHEN MATCHED THEN UPDATE SET tgt.FINAL_TREND = src.prev_response;
方案2:使用可更新视图(写法更简洁)
如果你的表不存在复杂关联、主键完整,也可以直接更新带窗口函数计算结果的视图:
UPDATE ( SELECT FINAL_TREND, LAG(RESPONSE, 1) OVER (ORDER BY START_DATE) AS prev_response FROM DUMMY_YC ) SET FINAL_TREND = prev_response;
执行以上任意一种语句即可得到你预期的更新结果。
内容的提问来源于stack exchange,提问作者Prabhakar Kumar Jha
相关产品推荐
相关产品推荐

