【问题标题】:SELECT IN failing - large datasetSELECT IN 失败 - 大型数据集
【发布时间】:2011-09-12 12:38:54
【问题描述】:

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

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

【问题讨论】:

  • 您可能对TransactionRef 有一个NULL 值。这将始终导致NOT IN 返回零结果。
  • 顺便说一句:你到底在哪里读到"WHERE IN" type queries aren't reliable?我建议忽略来自同一来源的任何其他内容。
  • 谢谢 :) 谷歌的力量似乎完全可以把一个人送走。

标签: sql tsql subquery where


【解决方案1】:

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

如果 NULL 不是您的问题,那么您必须向我们提供 mroe 信息

【讨论】:

  • 谢谢 Mladen - 这是问题的根源 - 那里有一个 NULL,现在它可以工作了。
  • 我尝试过,但直到答案 10 分钟前它才会让我这样做。现在完成...谢谢。
【解决方案2】:

我完全错了还是您的查询与此完全相同:

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

编辑:再读一遍,你想只记录八月份的那些付款吗?然后你可以简单地在 where 中使用 BETWEEN。

你真正的需要是什么?

【讨论】:

  • 我希望不是 ;) 无论如何,区别在于子查询返回一组在 2011 年 8 月之前已经看到的事务引用。每个事务引用可能随着时间的推移出现多次,我只需要捕获在给定月份中首次出现的那些 - 因此排除条款。
【解决方案3】:

使用不存在

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2016-06-28
    • 2019-09-19
    相关资源
    最近更新 更多