Erstmal ist es eine gute Idee, sich ein Buch zu besorgen. Ich habe 'Inside
SQL xxxxx' (xxxxx = Versionsnummer vom
MSSQL) von Kalen Delaney (MS Press). Das arbeitest Du durch und dann stellst Du keine Fragen mehr
Nimm Dir einfach die innere
Query (die, die zählt) und ersetze das 'Count(*)' durch ein '*'. Dann siehst du, was alles gezählt werden WÜRDE. Ich mache es so:
1. Nur die Einschränkung auf ein Team
2. Dann zusätzlich die Einschränkung auf den Zeitraum (oder beides gleich)
3. Gibt es Einträge mit 'visibility = NULL'? Willst Du die mitzählen?
usw.
Ich verfeinere also die Abfrage, bis sie passt und versuche dabei, Sonderfälle gleich mit einzubauen. Das geht am Besten, in dem ich einen großen Zeitraum wähle.
Die Geschichte mit dem LEFT, RIGHT und FULL JOIN (oder ganz ohne) lässt sich einfach so erklären:
Zwei Tabellen: Paare und Kinder. Es gibt kinderlose Paare, Paare mit Kindern und Waisenkinder.
1. Alle Paare und, falls sie Kinder haben, auch Diese: Paare LEFT JOIN Kinder
2. Nur Paare mit Kindern: Paare JOIN Kinder
3. Alle Kinder, und falls sie Eltern haben, auch Diese: Paare RIGHT JOIN Kinder
4. Nur Paare ohne Kinder: Paare LEFT JOIN Kinder WHERE Kinder.Kind IS NULL
5. Nur Waisenkinder: Paare RIGHT JOIN Kinder WHERE Paare.Paar IS NULL
(Die ON - Klausel (Paare JOIN Kinder
ON Paar.paarID = Kinder.paarID) habe ich weggelassen.
Anmerkungen:
A LEFT JOIN B ist das Gleiche wie
B RIGHT JOIN A
(2) kann man auch so ausdrücken: Paare LEFT JOIN Kinder WHERE Kinder.Kind
is not null. Auf Deutsch bedeutet das:
"Alle Paare, und falls sie Kinder haben, auch Diese
WOBEI es ein Kind geben muss"
Ach, nochwas:
Die ON-Klausel dient zur logischen Verknüpfung der Tabellen und NICHT zum Filtern, das macht man in der WHERE-Klausel.
Es gibt aber auch Filter, die auch eine logische Verknüpfung sind, also ist da die Trennung nicht so klar.
Und nochwas:
JOINs über zwei Tabellen sind einfach, ab drei wirds dann haarig, daher ist es wichtig, möglichst nur in der WHERE-Klausel zu filtern.