使用内部联接的SQL查询不同计数

时间:2015-04-09 13:29:12

标签: sql-server

需要帮助确保以下查询不会返回不准确的结果。

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个“计费”记录。在给定的日期范围内,我只需要将项目计为“已结算”一次。

2 个答案:

答案 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代替联接,但是您必须检查数据以查看哪种效果更佳。