質問
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
所属していません StackOverflow