zeilen - sql spalten zählen




SQL-Abfrage, Anzahl mit 0 zählen (4)

Ich habe drei Tabellen: Seite, Anhang, Seitenanhang

Ich habe Daten wie diese:

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 würde gerne die Anzahl der Anhänge pro Seite erhalten, auch wenn diese Zahl 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 erhalte diese Ausgabe:

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 bekomme ich den 0 Teil?



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


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

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

Abhängig von der Datenbank können Sie für die Geschwindigkeit den Befehl UNION verwenden.

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

(
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)
)   

Die Datenbank, für die ich diese Lösung brauche, hat 20 Seiten in mehr als einer Million Anhängen. Die UNION hat es in 13 Sekunden laufen lassen, anstatt so lange ich gelangweilt war und versuchte einen anderen Weg (irgendwo über 60 Sekunden, bevor ich die Outer Join- und Subquery-Methoden tötete).





count