需要帮助确保以下查询不会返回不准确的结果。
select @billed = count(a.[counter]) from [dbo].cxitems a with (nolock)
inner join [dbo].cxitemhist b with (nolock) on a.[counter] = b.cxlink
where b.[eventtype] in ('BILLED','REBILLED')
and b.[datetime] between @begdate and @enddate
查询“大部分”都是准确的,但是对于给定的日期范围,cxitemhist表可能包含超过1个“计费”记录。在给定的日期范围内,我只需要将项目计为“已结算”一次。
答案 0 :(得分:0)
如果您只需要计算来自cxitems
表的记录,其中包含cxitemhist
表中的任何相应记录,则可以将exists
子句与子查询一起使用。
select @billed = count(a.[counter]) from [dbo].cxitems a
where exists(select * from [dbo].cxitemhist b
where a.[counter] = b.cxlink
and b.[eventtype] in ('BILLED','REBILLED')
and b.[datetime] between @begdate and @enddate)
但是,如果没有特定的数据,不能说这将如何影响性能,但它应该与你的代码相当快。
答案 1 :(得分:0)
对于用于连接的每个字段组合,您可以加入子查询,将限制为一行:
select @billed = count(a.[counter])
from [dbo].cxitems a
inner join (
select distinct cxlink
from [dbo].cxitemhist
where [eventtype] in ('BILLED','REBILLED')
and [datetime] between @begdate and @enddate
) b on a.[counter] = b.cxlink
您也可以在此处使用APPLY operator代替联接,但是您必须检查数据以查看哪种效果更佳。