ВЫБРАТЬ В случае сбоя - большой набор данных - PullRequest
0 голосов
/ 12 сентября 2011

Я пытаюсь оценить, сколько раз транзакция запускается в данном месяце в нашей системе для процесса сверки.

Ссылка на транзакцию может быть создана в предыдущем месяце, поэтому я пытаюсь исключить эти транзакции из итогового счета - первой мыслью было использование подхода типа «ГДЕ ВХОД», но результат всегда равен 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')

Ответы [ 3 ]

3 голосов
/ 12 сентября 2011

если в столбце TransactionRef есть ноль, значение not in вернет false .
использовать Exists.

если значения NULL не являются вашей проблемой, вы должны предоставить нам информацию mroe

0 голосов
/ 12 сентября 2011

использование не существует

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')
0 голосов
/ 12 сентября 2011

Я совершенно не прав или ваш запрос точно такой же, как этот:

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

Редактировать: читая еще раз, вы хотите, чтобы только те получатели были записаны в августе? Тогда вы можете просто использовать МЕЖДУ в где.

какова ваша реальная потребность?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...