您能帮我解决一下改进下面的简单查询吗? 根据上次修改日期(ODS_CHANGE_DATE),如果在过去两个月内修改了“ODS_CHANGE_FLAG”,则将其设置为“Y”(在此处未显示的上一个查询中完成)。
然后我想为那些月份创建的所有记录(基于CREATION_DATE)将RELOAD_INDICATOR标志设置为'Y'。通过这种方式,我可以发送过去两个月内至少修改过1条记录的那些月份的所有记录。
下面的查询可以解决问题,但我相信它可以使用where exists语句进行优化,但我不熟悉它,我无法让它适用于下面的示例。你愿意帮助我,所以我可以在不使用临时表的情况下在一个声明中做到这一点吗?
谢谢!
use ODS
update ODS_DCF_OUTPUT set reload_indicator = 'N'
drop table #dcf_output_changed
select concat(DATEPART(year, creation_date),DATEPART(month, creation_date)) as RELOAD_MONTH_CODES
into #dcf_output_changed
from ODS_DCF_OUTPUT
where ODS_CHANGE_FLAG = 'Y'
update ODS_DCF_OUTPUT
set ODS_DCF_OUTPUT.reload_indicator = 'Y'
FROM ODS_DCF_OUTPUT as a
inner join #dcf_output_changed as b on b.RELOAD_MONTH_CODES = concat(DATEPART(year, a.CREATION_DATE),DATEPART(month, a.CREATION_DATE))
答案 0 :(得分:0)
我相信您的查询可以在没有临时表的情况下简化 - 只要' ODS_CHANGE_FLAG'设置为' Y'在另一个查询中 - 如下:
update ODS_DCF_OUTPUT set reload_indicator = 'N' ;
UPDATE ODS_DCF_OUTPUT
SET a.reload_indicator = 'Y'
FROM ODS_DCF_OUTPUT a
WHERE
concat(DATEPART(year, a.CREATION_DATE),DATEPART(month, a.CREATION_DATE))
IN (
SELECT DISTINCT
concat(DATEPART(year, b.CREATION_DATE),DATEPART(month, b.CREATION_DATE))
FROM ODS_DCF_OUTPUT b WHERE b.ODS_CHANGE_FLAG = 'Y'
)
确保在弄乱数据之前先进行备份。