2008-08-31 4 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 

내가이 출력 좀하고 싶습니다 : 나는 0 부분을 어떻게합니까

NAME  ATTACHMENTSNUMBER 
first page 0 
second page 2 
third page 1 
fourth page 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

이 쿼리가 실행되지 않습니다. 그룹을 'page.name별로 그룹화'로 변경하십시오. – edosoft

1

내부 조인 대신 왼쪽 조인을 사용하면 레코드가 존재하지 않을 수 있습니다.

8

하위 쿼리를 사용하는 다른 해결책을 참조하십시오.

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

감사합니다! 나를 위해 잘 작동! – tienbuiDE

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은 지루하고 다른 방법 (외부 조인과 서브 쿼리 방법을 죽이기 전인 60 초 이상)을 오랫동안 시도하지 않고 13 초 만에 실행했습니다.

0

사용이 : 데이비드 B. 언급했듯이

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