Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужна помощь! SQL / 7 сообщений из 7, страница 1 из 1
03.05.2019, 11:56
    #39809451
Kristina_29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь! SQL
Есть задание: Предположим, что в таблице Building есть поле tot_num_days, содержащее суммарное число дней работы разных работников на этом здании. Создайте триггер, который будет обновлять это поле при каждом обновлении таблицы Assignment.

Вот код создания триггера:
go
create trigger update_assignment
on Assignment
for insert, update, delete
as
update Building
set tot_num_days = tot_num_days +
(select Num_days
from inserted
where inserted.Bldg_id = Building.Bldg_id)

update Building
set tot_num_days = tot_num_days -
(select Num_days
from deleted
where deleted.Bldg_id = Building.Bldg_id)

Если я добавляю какую-нибудь новую запись, то в столбец tot_num_days заполняется значениями NULL. В чем ошибка?
...
Рейтинг: 0 / 0
03.05.2019, 12:03
    #39809455
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь! SQL
Код: sql
1.
2.
3.
update b set tot_num_days = b.tot_num_days + i.Num_days
  from Building as b inner join inserted as i on i.Bldg_id = b.Bldg_id
;
...
Рейтинг: 0 / 0
03.05.2019, 12:04
    #39809456
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь! SQL
Kristina_29,

потому что изначально tot_num_days в таблице Building имеет значение NULL?
и прибавляя к NULL вы получаете NULL
...
Рейтинг: 0 / 0
03.05.2019, 12:12
    #39809462
Kristina_29
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь! SQL
Дмитрий Мух, вот какие значения в столбце изначально
...
Рейтинг: 0 / 0
03.05.2019, 12:19
    #39809468
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь! SQL
Kristina_29,

тогда понятно...

при добавлении записи (INSERT) в таблицу Assigment в deleted ничего нет и запрос
Код: sql
1.
2.
3.
(select Num_days
from deleted
where deleted.Bldg_id = Building.Bldg_id)

возвращает NULL

Bычитая NULL из tot_num_days вы получаете NULL.
...
Рейтинг: 0 / 0
03.05.2019, 12:31
    #39809477
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь! SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create trigger update_assignment
on Assignment
for insert, update, delete
as
begin
 set nocount on;

 update b
  tot_num_days = isnull(tot_num_days, 0) + s.Num_days_delta
 from
  (
   select
    Bldg_id, sum(Num_days)
   from
    (
     select Bldg_id, Num_days from inserted
     union all 
     select Bldg_id, -Num_days from deleted
    ) t(Bldg_id, Num_days)
  ) a(Bldg_id, Num_days_delta) join
  Building b on b.Bldg_id = a.Bldg_id;

end;
...
Рейтинг: 0 / 0
03.05.2019, 12:33
    #39809478
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь! SQL
Поправка
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
create trigger update_assignment
on Assignment
for insert, update, delete
as
begin
 set nocount on;

 update b
  tot_num_days = isnull(tot_num_days, 0) + s.Num_days_delta
 from
  (
   select
    Bldg_id, sum(Num_days)
   from
    (
     select Bldg_id, Num_days from inserted
     union all 
     select Bldg_id, -Num_days from deleted
    ) t(Bldg_id, Num_days)
   group by
    Bldg_id 
  ) a(Bldg_id, Num_days_delta) join
  Building b on b.Bldg_id = a.Bldg_id;

end;
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужна помощь! SQL / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]