如何使用exists语句改进简单的SQL查询?

时间:2016-05-26 09:02:12

标签: sql

您能帮我解决一下改进下面的简单查询吗? 根据上次修改日期(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))

1 个答案:

答案 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'
   )

确保在弄乱数据之前先进行备份。