2011-09-12 37 views
0

我正在尝试评估系统中某个给定月份中进行的事务在对帐过程中的启动次数。SELECT IN失败 - 大型数据集

交易参考可以在上个月创建,因此我试图从最终计数中排除这些交易 - 第一个想法是使用“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') 
+2

您probaly有''TransactionRef一个'NULL'值。这总是会导致'NOT IN'返回零结果。 –

+0

顺便说一句:你在哪里读过''WHERE IN“类型的查询是不可靠的?我建议无视来自同一来源的任何其他内容。 –

+0

谢谢:)谷歌的力量完全发送一个在一个荒谬的切线看起来。 – Chris

回答

3

如果列TransactionRef有任何空的不在will return false
使用存在。

如果空值是不是你的问题,那么你就必须给我们MROE信息

+0

感谢姆拉登 - 这是问题的根源 - 那里有一个NULL,它现在可以工作。 – Chris

+0

优秀。请将其标记为回答他们。感谢名单。 –

+0

我试过但它不会让我,直到答案是10分钟的老。现在完成...谢谢。 – Chris

0

上午我完全错误或查询是完全一样的,因为这一个:

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

编辑:再次阅读,你想只得到8月份记录的这些paymee?然后,你可以简单地在哪里使用BETWEEN。

你真正的需求是什么?

+0

我希望不是;)无论如何,区别在于子查询返回一组在2011年8月之前见过的事务引用。每个事务引用可能会随时间出现多次,我只需要捕获第一次出现的事务引用在某个月的时间 - 因此排除条款。 – Chris

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')