1

在此示例中,我只有两个正在使用的表。我正在检查哪个可能运行得更快并且执行计划是相同的。这些查询的目的是查找与一个记录关联的最小日期,该日期大于另一个记录的最大日期。第一个查询更简洁(尽管它不允许DATEDIFF第二个查询的列)。从长远来看,我觉得第二种方式编写查询会在性能方面更加昂贵,也许当我有很多连接时。是否有关于哪种方法的一般规则,或者是逐案场景,您让优化器解决?

第一的

select c.patid,min(c.admitDate) as minDiabetesDate
    from clm_extract as c
    inner join icdClm as ic on ic.clmid=c.clmid
    where ic.icd like '250%' 
    group by c.patid
    having min(c.admitdate) > 
    (
        select MAX(c2.admitDate) as maxPreDiabetesDate
            from clm_extract as c2
            inner join icdClm as ic2 on ic2.clmid = c2.clmid
            where ic2.icd ='79029' and c2.patid=c.patid
            group by c2.patid
    )

第二

select distinct x.patid,x.minDiabetesDate,y.maxPreDiabetesDate 
from
(   

select c.patid, min(c.admitdate) as minDiabetesDate
    from clm_extract as c 
    inner join icdClm as ic on ic.clmid=c.clmid
    where ic.icd like '250%'
    group by c.patid
)x
inner join 
(
select c2.patid, MAX(c2.admitdate) as maxPreDiabetesDate
    from clm_extract as c2
    inner join icdClm as ic2 on ic2.clmid=c2.clmid
    where ic2.icd ='79029'
    group by c2.patid
)y on x.patid=y.patid
group by x.minDiabetesDate,y.maxPreDiabetesDate,x.patid
having DATEDIFF(dd,y.MaxPreDiabetesDate,x.minDiabetesDate) > 0
4

1 回答 1

4

您已经观察到这两个查询具有相同的执行计划。这并不奇怪。SQL 是描述性语言而不是过程性语言。也就是说,语言描述的是正在生产的东西,而不是生产它的方法。

当您执行一条in语句或exists带有子查询的语句时,您正在执行连接。语法不同,但逻辑处理是一样的。这只是表达联接的另一种方式。引擎需要考虑一些差异。distinct例如,“IN”在子查询上进行隐式连接。

作为偏好,我更喜欢第二个版本。from如果可能,我喜欢在子句中提到的查询中使用表。

在考虑您的查询之后,有一种更简单的方法来编写它:

select c.patid,
       min(case when ic.icd like '250%' then c.admitDate end) as minDiabetesDate,
       MAX(case when ic.icd = '79029' then c.admitDate end) as maxPreDiabetesDate
from clm_extract c
     inner join
     icdClm ic
     on ic.clmid=c.clmid
where ic.icd like '250%' or ic.icd = '79029' 
group by c.patid
having MAX(case when ic.icd = '79029' then c.admitDate end) <
       min(case when ic.icd like '250%' then c.admitDate end) 

这将case语句与聚合函数结合使用来计算您想要的日期。顺便说一句,您datediffhaving子句中使用了 a 。这对于简单的比较是不必要的。您可以只使用“=”、“<”等来比较日期。

于 2012-10-25T16:05:25.487 回答