14

ページ、添付ファイル、ページ添付ファイルの3つのテーブルがあります

私はこのようなデータを持っています:

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

1ページあたりの添付ファイル数が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の部分を取得するにはどうすればよいですか?

4

6 に答える 6

31

「内部結合」を「左外部結合」に変更します。これは、「右側に一致する行がない場合でも、結合の左側にあるすべての行を取得する」ことを意味します。

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
于 2008-08-31T10:41:16.793 に答える
10

サブクエリを使用した別のソリューションを次に示します。

SELECT
  p.name,
  (
    SELECT COUNT(*) FROM [page-attachment] pa
    WHERE pa.[PAGE-ID] = p.id
  ) as attachmentsnumber
FROM page p
于 2008-09-17T18:55:40.297 に答える
3

データベースによっては、速度のために 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)
)   

このソリューションが必要なデータベースには、100 万を超える添付ファイルが 20 ページ含まれています。UNION は、退屈して別の方法を試すのに時間がかかるのではなく、13 秒で実行しました (外部結合とサブクエリのメソッドを強制終了する前に 60 秒以上かかりました)。

于 2015-01-27T19:47:05.890 に答える
1

レコードが存在しないようにするため、内部結合ではなく左結合が必要です。

于 2008-08-31T10:41:26.933 に答える
1

左の参加はあなたの友達です。さまざまな結合タイプの詳細については、http://en.wikipedia.org/wiki/Join_(SQL)を参照してください。

于 2008-08-31T10:42:11.970 に答える