使用计数

使用计数

问题描述:

我有两个表如下定义连接两个表:使用计数

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 

我试图执行一个选择取回所有电子邮件和多少附件的计数(如有的话)在这些电子邮件表的每一行 - 最好是在一个单一的查询,其中的结果将类似于这样的:

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

我用尽了一切办法,但“正道”,如果任何人有几分钟的时间来帮我创建正确的SQL来构建这个,我非常感谢它。谢谢。

我喜欢brydgesk's solution,但不希望在可能的情况下不使用子查询。
如果给定电子邮件没有附件,则此查询将显示0。

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

那一个钉它。非常感激。 – Dave 2010-05-04 00:31:44

+0

@Dave:很高兴你能工作。我已经忘记将你的问题记录为有用和清晰,但现在已经这样做了。干杯。 – bernie 2010-05-04 00:34:40

+0

顺便说一句,感谢您向我展示COALESCE功能。 TBH,我从来没有见过:(但是,现在我可以看到在这种情况下它有多么的有用, – Dave 2010-05-04 01:01:20

你有没有尝试过这样的事情? (未经测试)

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 

你可以这样做,因为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