質問

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

ページごとの添付ファイルの数を取得したい その数字が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

データベースによっては、速度を上げるために 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 ページに 100 万件以上の添付ファイルが含まれています。UNION を使用すると、退屈して別の方法を試したほど長くはなりませんでしたが、13 秒で実行できました (外部結合メソッドとサブクエリ メソッドを強制終了するまでに 60 秒を超えたあたり)。

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

LEFT 結合はあなたの友達です。さまざまな結合タイプの詳細については、を参照してください。 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