Если у вас есть отдельная таблица пользователей, вам нужно перекрестное объединение календаря и пользователей, а затем оставить внешнее объединение с таблицей нарушений, как уже показал Гордон Линофф.
Однако, если вы не имеет таблицу пользователей, и вы должны просто выбрать их из таблицы нарушений, тогда вам следует использовать внешнее соединение раздела , которое существует именно для этой цели:
select v.user, c.date, v.violations
from calendar c left outer join violations v
PARTITION BY (v.user) -- this is what you must add
on c.date = v.date
order by user,date
;
Преимущество заключается в том, что вам не нужно читать таблицу нарушений дважды.
Обратите внимание, что DATE и USER и ключевые слова не должны использоваться в качестве имен столбцов; Я последовал твоему примеру, но твое руководство нехорошо.