Выберите количество, удовлетворяющее 2 условиям? - PullRequest
0 голосов
/ 16 ноября 2010
Select count(*) from Merchant where Email in 
(Select SentEmail from MerchantInvitations where MerchantID = '16092') AND 
CreatedOn>  (Select TimeSent from MerchantInvitations where MerchantID = '16092')

Я хочу, чтобы количество торговцев, чей адрес электронной почты был указан в столбце SentEmail в MerchantInvitations и CreatedOn> Timesent в MerchantInvitations. Но я получаю сообщение об ошибке: «Подзапрос вернул более 1 значения. Это разрешено, когда подзапрос следует =,! =, <, <= и т. д. или когда подзапрос используется в качестве выражения "Помогите мне, пожалуйста! Спасибо заранее! </p>

Ответы [ 6 ]

2 голосов
/ 16 ноября 2010

Более одной записи в MerchantInvitations, где MerchantID = '16092' может вызвать эту проблему. Может быть, вы хотите самый последний TimeSent, как это:

Select count(*) from Merchant where Email in 
(Select SentEmail from MerchantInvitations where MerchantID = '16092') AND 
CreatedOn>  (Select MAX(TimeSent) from MerchantInvitations where MerchantID = '16092')
1 голос
/ 16 ноября 2010

Если ваш второй подзапрос возвращает более одной строки, он никогда не будет работать.Вы можете использовать ЛЮБОЕ или ВСЕ ключевое слово, хотя:

SELECT COUNT(*)
FROM Merchant
WHERE Email IN (SELECT SentEmail
               FROM MerchantInvitations
               WHERE MerchantID = '16092') -- Why not 16092? Is it really a string?
AND CreatedOn > ANY (SELECT TimeSent
                     FROM MerchantInvitations
                     WHERE MerchantID = '16092');

Но похоже, что вы просто хотите сделать простое объединение:

SELECT COUNT(*)
FROM Merchant M
INNER JOIN MerchantInvitations I
    ON M.MerchantID = I.MerchantID -- You may have to change this
    AND M.Email = I.SentEmail
    AND M.CreatedOn > I.TimeSent
WHERE M.MerchantID = 16092;

, которое определенно должно быть быстрее, чем ваши подзапросы.

0 голосов
/ 16 ноября 2010

Использовать один подзапрос EXISTS:

Select count(*) 
from Merchant M
where exists
(select null
 from MerchantInvitations I
 where M.Email = I.SentEmail AND 
       M.CreatedOn > I.TimeSent AND
       I.MerchantID = '16092')
0 голосов
/ 16 ноября 2010

использовать там, где существует вместо

Select count(*) from Merchant where exists
(Select SentEmail from MerchantInvitations where MerchantID = '16092' and MerchantInvitations.sentemail = merchant.email) AND 
CreatedOn>  (Select TimeSent from MerchantInvitations where MerchantID = '16092' and MerchantInvitations.sentemail = merchant.email)
0 голосов
/ 16 ноября 2010

Проблема, вероятно,

 (Select TimeSent from MerchantInvitations where MerchantID = '16092')

Если этот подзапрос возвращает более одного значения, то как ядро ​​базы данных узнает, какое сравнение с CreatedOn?

Вы можете устранить проблему, используя MIN (TimeSent) или MAX (TimeSent) в подзапросе (вместо TimeSent), в зависимости от того, что подходит.

0 голосов
/ 16 ноября 2010

Похоже, ваш подзапрос возвращает более одного TimeSent, который сравнивается с CreatedOn. Чтобы исправить это, добавьте спецификатор ALL как:

Select count(*) from Merchant where 
Email in (Select SentEmail from MerchantInvitations where MerchantID = '16092') AND 
CreatedOn > ALL (Select TimeSent from MerchantInvitations where MerchantID = '16092')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...