2011-09-12 7 views
0

私は、システム内の特定の月にトランザクションが開始された回数を照合プロセスのために評価しようとしています。SELECT IN failing - large dataset

トランザクション参照は前月に作成することができますので、これらのトランザクションを最終的なカウントから除外しようとしています。最初の考えは「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') 

EDIT OKさらに答えに、それはNULL値が間違って私をやっていたようだ...おかげで - ここでは、編集されたコードです場合には誰もが将来的には、ここでつまずく:

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

存在しません。これは常に 'NOT IN'がゼロの結果を返すようにします。 –

+0

ところで「どこの "タイプクエリが信頼できないのですか?"私は同じソースから他のものを無視することをお勧めします。 –

+0

ありがとう:) Googleのパワーは、ばかばかしい接線で完全にオフに送信するようです。 – Chris

答えて

3

TransactionRef列にnullが含まれている場合、will return falseには含まれません。
が存在します。

NULLがあなたの問題ではありませんならば、あなたは私たちにmroe情報を提供する必要があります

+0

ありがとう、Mladen - これは問題の根源でした。そこにはNULLがあり、現在は機能しています。 – Chris

+0

が優れています。答えとしてマークしてください。高すぎる。 –

+0

私はしようとしましたが、回答が10分前になるまでそれはできませんでした。今は...ありがとう。 – Chris

0

は、私は完全に間違っているか、あなたのクエリは、この1とまったく同じである:

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

編集:もう一度読むと、8月に記録されたペイメントのみを取得しますか?それで、あなたはどこででもBETWEENを使うことができます。

本当に必要なのは何ですか?

+0

私は望みません;)とにかく、サブクエリは2011年8月以前に見られた一連のトランザクション参照を返します。各トランザクション参照は時間の経過とともに複数回表示されることがあります。与えられた月の時間 - 従って除外条項。 – Chris

0

使用することは、あなたがprobaly `TransactionRef`は `NULL`値を持つ

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