2

我知道这个问题有很多变体,但找不到能回答我正在寻找的问题的问题。

我从另一个不再出现在图片中的程序员那里继承了一个数据库和报告。

查询之一使用此代码:

Select
     b.HospitalMasterID
    ,b.TxnSite
    ,b.PatientID
    ,b.TxnDate as KeptDate
From
    Billing as b
    Inner Join Patient as p
        on b.HospitalMasterID = p.HospitalMasterID
        and b.PatientID = p.PatientID
Where
    b._IsServOrItem=1
    and b.TxnDate >= '20131001'
    and (Case
            When b.ExtendedAmount > 0 Then 1
            When (Not(p.PlanCode is null)) and (b.listAmount >0) then 1
        End = 1)

当我运行查询时,我得到 apx 900,000 行返回。如果我删除 Case 语句,我会返回超过一百万行。

有人可以解释为什么会这样吗?案例陈述究竟在做什么?有没有更好的方法来完成同样的事情。我真的不喜欢这种说法,而且由于缺乏结构,整个报告查询很难阅读。

Sql 的版本是 T-Sql 2012。

谢谢,

4

2 回答 2

5

在我看来,它正在这样做:

(b.ExtendedAmount > 0 OR (Not(p.PlanCode is null) and (b.listAmount >0)))

也许它是从其他地方复制/粘贴并修改的?无论如何,这很奇怪。

于 2013-11-12T00:53:49.497 回答
1

我认为有人试图避免使用OR运算符来促进索引搜索而不是扫描。该计划值得一看,但如果它与格雷格回答中的逻辑有显着差异,我会感到惊讶。

于 2013-11-12T02:13:50.830 回答