Ich habe mich gerade ein bisschen mit SQL beschäftigt. Ich glaube nicht, dass ich die Frage brillant formulieren kann - also lass es mich dir zeigen.
Ich habe zwei Tische, einen namens Person, einen Termin. Ich versuche, die Anzahl der Termine einer Person zurückzugeben (auch wenn sie Null hat). Termin enthält die person_id
und es gibt eine person_id
pro Termin. So COUNT(person_id)
ist ein vernünftiger Ansatz.
Die Abfrage:
SELECT person_id, COUNT(person_id) AS "number_of_appointments"
FROM appointment
GROUP BY person_id;
Gibt die Anzahl der Termine, die eine person_id hat, korrekt zurück. Eine Person mit 0 Terminen wird jedoch nicht zurückgegeben (offensichtlich, da sie nicht in dieser Tabelle enthalten ist).
Wenn ich die Anweisung so ändere, dass person_id aus der Personentabelle entfernt wird, habe ich ungefähr Folgendes:
SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM appointment
JOIN person ON person.person_id = appointment.person_id
GROUP BY person.person_id;
Dies wird jedoch immer noch nur eine person_id zurückgeben, die einen Termin hat und nicht das, was ich will, was eine Rückgabe mit Personen ist, die 0 Termine haben!
Irgendwelche Vorschläge bitte?
quelle
Antworten:
Sie möchten dafür eine äußere Verknüpfung (und Sie müssen die Person als "Fahr" -Tabelle verwenden).
Der Grund, warum dies funktioniert, ist, dass der äußere (linke) Join
NULL
für diejenigen Personen zurückkehrt, die keinen Termin haben. Die Aggregatfunktion zähltcount()
keineNULL
Werte und daher erhalten Sie eine Null.Wenn Sie mehr über äußere Verknüpfungen erfahren möchten, finden Sie hier ein nettes Tutorial: http://sqlzoo.net/wiki/Using_Null
quelle
Sie müssen
LEFT JOIN
anstelle von verwendenINNER JOIN
quelle
Wenn Sie den äußeren Join (mit der Anzahl) ausführen und dieses Ergebnis dann als Untertabelle verwenden, können Sie wie erwartet 0 erhalten (dank der Funktion nvl).
Ex:
quelle
Verwenden Sie join, um mit GROUP BY die Anzahl 0 im Ergebnis zu erhalten.
Durch einfaches 'Join' wird der innere Join in MS SQL ausgeführt. Wählen Sie also den linken oder rechten Join.
Wenn die Tabelle, die den Primärschlüssel enthält, zuerst in der Abfrage erwähnt wird, verwenden Sie LEFT join else RIGHT join.
Z.B:
.
Nehmen Sie die Gruppe von aus der Tabelle mit dem Primärschlüssel und zählen Sie aus der anderen Tabelle mit den tatsächlichen Einträgen / Details.
quelle
Um Ihre ursprüngliche Abfrage noch weniger zu ändern, können Sie Ihren Join in einen
RIGHT
Join verwandelnDies baut nur auf der ausgewählten Antwort auf, aber da die äußere Verknüpfung in die
RIGHT
Richtung weist, muss nur ein Wort hinzugefügt und weniger geändert werden. - Denken Sie daran, dass es vorhanden ist und manchmal Abfragen lesbarer macht und weniger Neuerstellung erfordert.quelle
Das Problem mit einem LEFT JOIN ist, dass, wenn keine Termine vorhanden sind, immer noch eine Zeile mit einer Null zurückgegeben wird, die, wenn sie von COUNT aggregiert wird, 1 wird, und es scheint, dass die Person einen Termin hat, wenn sie tatsächlich keinen hat. Ich denke, dies wird die richtigen Ergebnisse liefern:
quelle