我知道这个问题有各种变化,但找不到能解答我想要的问题。
我继承了一个数据库并报告了另一位不再参与其中的程序员。
其中一个查询使用此代码:
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)
当我运行查询时,我得到了返回900x行的apx。如果我删除Case语句,我会返回超过一百万行。
有人可以解释为什么会这样吗?案件陈述到底是做什么的?有没有更好的方法来完成同样的事情。我真的不喜欢这个陈述,因为缺乏结构,整个报表查询很难阅读。
Sql的版本是T-Sql 2012。
谢谢,
答案 0 :(得分:5)
对我而言似乎正在这样做:
(b.ExtendedAmount > 0 OR (Not(p.PlanCode is null) and (b.listAmount >0)))
也许它是从其他地方复制/粘贴并修改过的?无论如何,这很奇怪。
答案 1 :(得分:1)
我认为有人试图避免使用OR
运算符来促进索引搜索扫描。值得一看这个计划,但如果它与格雷格的答案中的逻辑有很大不同,我会感到惊讶。