2008-08-31 9 views
11

Ich habe drei Tabellen: Seite, attachment, SeitenbefestigungSQL Query, Graf mit 0 Zählung

Ich habe Daten wie folgt aus:

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 

Ich möchte die Anzahl der Anlagen pro Seite erhalten auch, wenn diese Nummer 0 ist. Ich habe versucht, mit:

select page.name, count(page-attachment.id) as attachmentsnumber 
from page 
    inner join page-attachment on page.id=page-id 
group by page.id 

ich diesen Ausgang bin immer:

NAME  ATTACHMENTSNUMBER 
second page 2 
third page 1 

Ich möchte diese Ausgabe erhalten:

NAME  ATTACHMENTSNUMBER 
first page 0 
second page 2 
third page 1 
fourth page 0 

Wie kann ich die 0 Teil bekommen?

Antwort

25

Ändern Sie Ihren "inneren Join" zu einem "linken äußeren Join", was bedeutet, "holen Sie mir alle Zeilen auf der linken Seite des Joins, auch wenn es keine passende Zeile auf der rechten Seite gibt."

+0

Als David B. diese Abfrage erwähnt wird nicht ausgeführt. Ändern Sie die Gruppe nach "Gruppe nach Seite.Name" – edosoft

1

Sie möchten einen linken Join statt eines inneren Joins, da Datensätze nicht existieren können.

8

Hier ist eine andere Lösung mit Sub-Querying.

+0

danke! funktioniert gut für mich! – tienbuiDE

2

Je nach Datenbank können Sie für die Geschwindigkeit den UNION-Befehl verwenden.

Die SQL ist länger, aber, abhängig von der Datenbank, beschleunigt es Dinge durch die Trennung "Dinge zählen, die da sind" und "zählen Dinge, die nicht da sind".

Die Datenbank, für die ich diese Lösung brauche, hat 20 Seiten in mehr als einer Million Anlagen Die UNION hat es in 13 Sekunden laufen lassen, anstatt so lange, dass mir langweilig wurde und ich es auf eine andere Art und Weise versuchte (irgendwo über 60 Sekunden bevor ich die äußeren Join und Unterabfrage-Methoden eliminierte).

0

verwenden:

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