SELECT IN失败 - 大型数据集

时间:2011-09-12 12:38:54

标签: sql tsql subquery where

我正在尝试评估系统中给定月份的交易启动次数以进行对帐流程。

交易参考可以在前一个月创建,所以我试图从最终计数中排除这些交易 - 首先想到的是使用“WHERE IN”类型方法,但结果总是0,这肯定是错误的当我单独执行查询时,子查询中的条目应该被排除。

我已经读过“WHERE IN”类型查询不可靠,尤其是当子查询中返回了大量数据集时,但我不知道如何重新编写这个以实现此目标的目标,并且去如果这样做的方式是有缺陷的,那就是前进了。

当前查询如下所示 - 感谢您的帮助:

 SELECT Count(DISTINCT TransactionRef)
 FROM Payments 
 WHERE Month(PaymentDate) = 8 
 AND Year(PaymentDate) = 2011 
 AND TransactionRef NOT IN 
      (SELECT DISTINCT TransactionRef 
       FROM Payments WHERE PaymentDate < '20110801')

修改 好的答案,似乎是一个空值让我错了...谢谢 - 这里是编辑过的代码,万一有人在将来偶然发现:

 SELECT Count(DISTINCT TransactionRef)
 FROM Payments 
 WHERE Month(PaymentDate) = 8 
 AND Year(PaymentDate) = 2011 
 AND TransactionRef NOT IN 
      (SELECT DISTINCT TransactionRef 
       FROM Payments WHERE TransactionRef IS NOT NULL AND PaymentDate < '20110801')

3 个答案:

答案 0 :(得分:3)

如果TransactionRef列中有任何空值,则不在will return false中 使用存在。

如果NULL不是你的问题,那么你将不得不给我们mroe info

答案 1 :(得分:0)

我完全错了,或者您的查询与此完全相同:

 SELECT Count(DISTINCT TransactionRef)
 FROM Payments 
 WHERE Month(PaymentDate) = 8 
 AND Year(PaymentDate) = 2011 
 AND (PaymentDate >= '20110801')

编辑:再次阅读,您是否只想获得8月份记录的那些付费用户?然后你可以在where中使用BETWEEN。

你真正需要什么?

答案 2 :(得分:0)

使用不存在

SELECT Count(DISTINCT TransactionRef)  FROM Payments  p1 

WHERE Month(PaymentDate) = 8   

AND Year(PaymentDate) = 2011   

AND not exists (SELECT 1 FROM Payments p2


                           where p2.TransactionRef =p1.TransactionRef
                           and PaymentDate < '20110801')