2008-08-31 161 views
11

我有三個表:頁,附件,頁附件SQL查詢,計數爲0計數

我有這樣的數據:

page 
ID NAME 
1  first page 
2  second page 
3  third page 
4  fourth page 

attachment 
ID NAME 
1  foo.word 
2  test.xsl 
3  mm.ppt 

page-attachment 
ID PAGE-ID ATTACHMENT-ID 
1  2   1 
2  2   2 
3  3   3 

我想獲得每頁附件的數量也是當這個數字是0。我曾嘗試用:

select page.name, count(page-attachment.id) as attachmentsnumber 
from page 
    inner join page-attachment on page.id=page-id 
group by page.id 

我得到這樣的輸出:

NAME  ATTACHMENTSNUMBER 
second page 2 
third page 1 

我想獲得這個輸出:

NAME  ATTACHMENTSNUMBER 
first page 0 
second page 2 
third page 1 
fourth page 0 

如何得到0的一部分?

回答

25

將您的「內連接」更改爲「左外連接」,這意味着「即使在右側沒有匹配的行,也可以讓我連接左側的所有行。

select page.name, count(page-attachment.id) as attachmentsnumber 
from page 
    left outer join page-attachment on page.id=page-id 
group by page.name 
+0

正如David B.提到這個查詢不會運行。將組更改爲'group by page.name' – edosoft 2009-01-21 13:04:07

1

您想要一個左連接而不是內連接,因爲這樣可以使記錄不存在。

8

這是另一種使用子查詢的解決方案。

​​
+0

謝謝!適合我! – tienbuiDE 2014-11-15 18:19:39

2

根據數據庫的不同,對於速度,可以使用UNION命令。

SQL比較長,但是,根據數據庫的不同,它通過分開「統計存在的事物」和「計算不存在的事物」來加快速度。

(
select page.name, count(page-attachment.id) as attachmentsnumber 
from page 
inner join page-attachment on page.id=page-id 
group by page.id 
) 
UNION 
(
select page.name, 0 as attachmentsnumber 
from page 
where page.id not in (
    select page-id from page-attachment) 
) 

我需要這個解決方案的數據庫有超過一百萬個附件的20頁。 UNION使它在13秒內運行,而不是這麼長時間,我感到無聊,並嘗試另一種方式(在我殺死外連接和子查詢方法之前60秒以上的地方)。

0

使用此:

SELECT p.name,(
    SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id) as attachmentsnumber 
FROM page p