Po prostu trochę utknąłem w trochę SQL. Myślę, że nie potrafię genialnie sformułować tego pytania - więc pozwól, że ci pokażę.
Mam dwa stoliki, jeden na wezwanie, drugi na spotkanie. Próbuję zwrócić liczbę spotkań, które dana osoba ma (w tym jeśli ma zero). Termin zawiera person_id
i jest person_id
na spotkanie. Więc COUNT(person_id)
jest to rozsądne podejście.
Zapytanie:
SELECT person_id, COUNT(person_id) AS "number_of_appointments"
FROM appointment
GROUP BY person_id;
Wróci poprawnie, liczba spotkań, które posiada person_id. Jednak osoba, która ma 0 spotkań, nie jest zwracana (oczywiście, ponieważ nie ma ich w tej tabeli).
Poprawienie instrukcji w celu pobrania identyfikatora osoby z tabeli osób daje mi coś takiego:
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;
To jednak nadal zwróci tylko osobę, która ma spotkanie, a nie to, czego chcę, czyli zwrot z osobami, które mają 0 spotkań!
Jakieś sugestie?
źródło
Odpowiedzi:
Potrzebujesz do tego sprzężenia zewnętrznego (i musisz użyć osoby jako tabeli „sterującej”)
Powodem, dla którego to działa, jest to, że zewnętrzne (lewe) połączenie powróci
NULL
dla osób, które nie mają spotkania. Funkcja agregującacount()
nie będzie liczyćNULL
wartości, a zatem otrzymasz zero.Jeśli chcesz dowiedzieć się więcej o złączeniach zewnętrznych, oto fajny samouczek: http://sqlzoo.net/wiki/Using_Null
źródło
Musisz użyć
LEFT JOIN
zamiastINNER JOIN
źródło
jeśli wykonasz złączenie zewnętrzne (z liczbą), a następnie użyjesz tego wyniku jako tabeli podrzędnej, możesz uzyskać 0 zgodnie z oczekiwaniami (dzięki funkcji nvl)
Dawny:
źródło
UŻYJ sprzężenia, aby uzyskać 0 zliczenie w wyniku za pomocą GROUP BY.
po prostu „dołącz” powoduje złączenie wewnętrzne w MS SQL, więc wybierz złączenie lewe lub prawe.
Jeśli tabela zawierająca klucz podstawowy jest wymieniona jako pierwsza w ZAPYTANIU, użyj LEWEGO sprzężenia w przeciwnym razie PRAWEGO sprzężenia.
NA PRZYKŁAD:
.
Weź grupowanie z tabeli, która ma klucz podstawowy i policz od innej tabeli, która ma rzeczywiste wpisy / szczegóły.
źródło
Aby zmienić jeszcze mniej w pierwotnym zapytaniu, możesz zmienić połączenie w
RIGHT
sprzężenieTo po prostu opiera się na wybranej odpowiedzi, ale ponieważ sprzężenie zewnętrzne jest skierowane w
RIGHT
kierunku, wystarczy dodać tylko jedno słowo i mniej zmian. - Pamiętaj tylko, że jest tam i czasami może sprawić, że zapytania będą bardziej czytelne i wymagać mniej przebudowy.źródło
Problem z LEFT JOIN polega na tym, że jeśli nie ma żadnych spotkań, nadal zwróci jeden wiersz z wartością zerową, która po zagregowaniu przez COUNT stanie się 1 i okaże się, że dana osoba ma jedno spotkanie, podczas gdy w rzeczywistości nie ma żadnego. Myślę, że to da prawidłowe wyniki:
źródło