2011-09-12 40 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')