2011-09-12 3 views
0

조정 프로세스에 대해 Google 시스템에서 주어진 달에 트랜잭션이 시작된 횟수를 평가하려고합니다.SELECT IN failing - large 데이터 세트

트랜잭션 참조는 지난 달에 생성 될 수 있으므로 최종 계산에서 해당 트랜잭션을 제외하려고합니다. 첫 번째 생각은 "WHERE IN"유형 접근법을 사용하는 것이지만 결과는 항상 0입니다. 쿼리를 독립적으로 실행할 때와 마찬가지로 하위 쿼리에는 제외해야 할 항목이 있습니다.

"WHERE IN"유형 쿼리가 특히 하위 쿼리에 큰 데이터 집합이 반환 될 때 신뢰할 수 없다는 것을 읽었지만이 경우 목표를 달성하기 위해이 데이터를 다시 작성하는 방법을 알지 못합니다. 그것이하는 것처럼 보이는이 결함이 결함이 있다면 앞으로 나아갈 것입니다.

현재 쿼리는 다음과 같습니다 - 당신의 도움을 주셔서 감사합니다 - 여기에 편집 된 코드입니다 ... OK 자세한 답변을

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

편집 , 그것은 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

당신은 probaly'TransactionRef'에 대한'NULL' 값이 존재하는 것이다. 이것은 항상'NOT IN'이 0 개의 결과를 리턴하도록합니다. –

+0

BTW :''어디에서 ""검색어가 신뢰할 수없는 곳에서 읽었습니까? " 동일한 출처의 다른 것을 무시하는 것이 좋습니다. –

+0

감사합니다 :) Google의 힘은 완전히 우스꽝스러운 탄젠트에 하나를 보내는 것 같습니다. – Chris

답변

3

TransactionRef 열에 null이 있으면 will return false이 아닙니다.
사용됩니다. 널 (NULL)이 문제가 아닌 경우

당신은 mroe 정보를 우리에게

+0

감사합니다 Mladen - 이것이 문제의 근원이었습니다 - 거기에 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 월에 기록 된 payme 만 받으시겠습니까? 그럼 어디서나 간단히 사용할 수 있습니다.

당신의 진짜 필요는 무엇입니까?

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