У вас уже есть заполнитель. «Заполнитель для unknown data» в SQL является нулевым.
Вам не нужно ничего предварительно заполнять: либо у вас есть строка с несколькими столбцами, имеющими неизвестное значение (null), либо у вас нет строки вообще, так что при выполнении внешнего соединения получится строка, которая все ноль. В любом случае, данные атрибута (по существу, поля не-id) будут нулевыми.
И агрегат sum()
будет игнорировать нули.
Итак, допустим, что у вас do есть строка для игры (поскольку она запланирована заранее), но нет соответствующих строк для ее периодов (поскольку они еще не были сыграны). Затем вы создаете игру с внешним соединением для периода (внешнюю, так что вы включаете как игры с , так и игры без , данные периода):
select a.*, sum(b.goals_scored)
from game a left outer join period b on (b.game_id = a.id)
group by a.id;
Показывает общее количество голов (для обеих команд) по играм; для игр без периодов вы получаете ноль (что означает в SQL «мы (пока) не знаем»)
В этом запросе отображаются только общие цели для завершенных игр и игр в процессе (игры, в которых был сыгран хотя бы один период) :
select a.*, sum(b.goals_scored)
from game a join period b on (b.game_id = a.id)
group by a.id;
Это представление отфильтровывает незавершенные игры (при условии, что вы всегда добавляете ранние периоды раньше, чем более поздние):
create view complete_games as
select a.* from games a
where exists (select * from period b
where b.game_id = a.id and b.number = a.number_of_periods)
Используя это представление, мы можем затем суммировать только завершенные игры:
select a.*, sum(b.goals_scored)
from complete_games a join period b on (b.game_id = a.id)
group by a.id;
Таким образом, нет необходимости предварительно заполнять, нет необходимости в триггере, что наиболее важно, нет необходимости добавлять ложные данные (требуются нулевые цели, когда фактически период еще не был сыгран), нет необходимости обновлять правильные данные , Просто введите период, когда у вас есть данные для этого.