2010-05-03 13 views
1

J'ai deux tables telles que définies ci-dessous:Joindre deux tables en utilisant un compte

EMAILS 
ID  SUBJECT BODY 
1  Test1  blah blah 
2  Test2  blah blah blah 
3  Test3  more blah 

ATTACHMENTS 
ID EMAIL_ID ATTACHMENT NAME 
1 2   TEST.DOC 
2 2   TEST.XLS 

J'essaie d'effectuer une sélection pour récupérer tous les e-mails et un compte de combien de pièces jointes (le cas échéant) pour chaque ligne de la table eMAILS - de préférence en une seule requête où les résultats ressemblerait à quelque chose comme:

EMAIL_ID SUBJECT NUM_ATTACHMENTS  BODY 
    1  Test1  0     blah blah 
    2  Test2  2     blah blah blah 
    3  Test3  0     more blah 

J'ai tout essayé, mais le « droit chemin » et si quelqu'un a quelques minutes pour me aider créer le bon SQL pour construire cela, je l'apprécierais grandement. Merci.

Répondre

3

J'aime brydgesk's solution, mais je préfère ne pas utiliser une sous-requête lorsque cela est possible.
Cette requête affichera 0 lorsqu'il n'y a pas de pièces jointes pour un email donné.

SELECT 
    a.email_id, 
    e.subject, 
    e.body, 
    COALESCE(count(a.id),0) AS NUM_ATTACHMENTS 
FROM 
    emails e 
    LEFT OUTER JOIN attachments a 
    ON e.id = a.email_id 
GROUP BY 
    a.email_id, e.subject, e.body 
+0

Que l'on a clouée. Très appréciée. – Dave

+0

@Dave: content de l'avoir fait fonctionner. J'avais oublié de classer votre question comme étant utile et claire, mais je l'ai déjà fait. À votre santé. – bernie

+0

Btw, merci de m'avoir montré la fonction COALESCE. TBH, je n'ai même jamais vu ça :(Cependant, je peux maintenant voir à quel point cela peut être extrêmement utile dans cette situation – Dave

0

Avez-vous essayé quelque chose dans quelque chose comme ça? (Non testé)

SELECT 
    e.id, 
    e.subject, 
    count(*), 
    e.body 
FROM 
    (SELECT * 
    FROM emails e 
    JOIN attachments a 
    ON e.id = a.email_id) 
GROUP BY e.id, e.subject, e.body 
0

Vous pouvez le faire en tant que sous-requête simple dans la clause SELECT:

Select E.ID As EMAIL_ID 
    , E.SUBJECT 
    , (Select Count(*) 
     From ATTACHMENTS As A 
     Where A.EMAIL_ID = E.ID) As NUM_ATTACHMENTS 
    , E.BODY 
From EMAILS As E 
Questions connexes