2010-05-03 41 views
1

我有兩個表如下定義連接兩個表:使用計數

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來構建這個,我非常感謝它。謝謝。

回答

3

我喜歡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

0

你有沒有嘗試過這樣的事情? (未經測試)

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

你可以這樣做,因爲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