문제

나는 세 가지 테이블:페이지,첨부 파일,페이지 첨부 파일

나는 데이터는 다음과 같다:

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 부분입니까?

도움이 되었습니까?

해결책

변경"안"가입하기"왼쪽 외부에 가입하는 것을 의미,""나의 모든 행의 왼쪽에 가입하도 없는 경우에 일치하는 행 오른쪽에 있습니다."

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

다른 팁

여기에서 다른 솔루션을 사용하여 하위를 쿼리하.

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

에 따라 데이터베이스에 대한 속도로 사용할 수 있습니다 연합 명령입니다.

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 초간 전에 내가 죽는 외부에 가입하고 하위 방법).

당신이 원하는 왼쪽,가입신의 내면의 가입으로,할 수 있는 레코드를 존재하지 않습니다.

왼쪽에 가입하는 당신의 친구입니다.대한 더 많은 정보는 다른 참여 유형 http://en.wikipedia.org/wiki/Join_(SQL)

이것을 사용:

SELECT p.name,(
    SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id) as attachmentsnumber
FROM page p
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top