Você quer uma junção externa para isso (e você precisa usar pessoa como a tabela de "condução")
SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM person
LEFT JOIN appointment ON person.person_id = appointment.person_id
GROUP BY person.person_id;
A razão pela qual isso está funcionando é que a junção externa (esquerda) retornará
NULL
para as pessoas que não têm hora marcada. A função agregada count()
não contará NULL
valores e assim você obterá um zero. Se você quiser aprender mais sobre associações externas, aqui está um bom tutorial:http://sqlzoo.net/wiki/Using_Null