2010-11-16 7 views
0
Select count(*) from Merchant where Email in 
(Select SentEmail from MerchantInvitations where MerchantID = '16092') AND 
CreatedOn> (Select TimeSent from MerchantInvitations where MerchantID = '16092') 

Je souhaite connaître le nombre de marchands dont l'adresse électronique figure dans la colonne SentEmail dans MerchantInvitations et CreatedOn> Timesent dans MerchantInvitations. Mais je reçois une erreur que "Sous-requête a renvoyé plus de 1 valeur .Ceci est autorisé lorsque la sous-requête suit =,! =,, 5054, < =, etc ou lorsque la sous-requête est utilisée comme expression" Help me out !! Merci d'avance!Sélectionnez le nombre satisfaisant 2 conditions?

Répondre

0

On dirait que vous sous-requête retourne plus d'un TimeSent qui est comparé à CreatedOn. Pour résoudre ce problème ajouter un spécificateur ALL comme:

Select count(*) from Merchant where 
Email in (Select SentEmail from MerchantInvitations where MerchantID = '16092') AND 
CreatedOn > ALL (Select TimeSent from MerchantInvitations where MerchantID = '16092') 
2

Plus d'une entrée dans MerchantInvitations où MerchantID = '16092' poserait ce problème. Peut-être que vous voulez que le TimeSent le plus récent, comme ceci:

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

Si votre deuxième sous-requête renvoie plus d'une ligne, ça ne marchera jamais. Vous pouvez utiliser tout ou mot-clé, bien que:

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

Mais il semble que vous voulez juste faire un simple joindre:

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; 

qui devrait certainement être plus rapide que vos sous-requêtes.

+0

+1 pour rejoindre, bien que 'COUNT (*)' 'devrait probablement être COUNT (DISTINCT M. MerchantID) '. –

+0

Je ne suis pas sûr, COUNT (DISTINCT M.MerchantID) retournera toujours 1 ou 0 puisque la clause WHERE limite le résultat à un seul marchand. Je pense qu'il veut connaître le nombre d'invitations qu'un commerçant avait avant "CreatedOn" –

+0

Pas nécessairement - je pense qu'il peut chercher différents marchands avec la même adresse e-mail, sinon il serait sûrement en train de sélectionner Merchant.MerchantID au lieu de MerchantInvitations.MerchantID dans la requête d'origine. Si j'ai raison, vous devrez aussi changer 'M.MerchantID' en' I.MerchantID' dans la deuxième requête. –

0

Le problème est probablement

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

Si cela retourne sous-requête plus d'une valeur, alors comment le moteur de base de données qui sait à comparer à CreatedOn?

Vous pouvez résoudre le problème en utilisant MIN (TimeSent) ou MAX (TimeSent) dans votre sous-requête (à la place de TimeSent), selon ce qui est approprié.

0

où existe au lieu l'utilisation de dans

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

Utilisez un sous-requête EXISTE:

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