Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нужна помощь! SQL  [new]
Kristina_29
Member

Откуда:
Сообщений: 3
Есть задание: Предположим, что в таблице 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. В чем ошибка?
3 май 19, 11:56    [21877277]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь! SQL  [new]
aleks222
Member

Откуда:
Сообщений: 920
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
;
3 май 19, 12:03    [21877282]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь! SQL  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3657
Kristina_29,

потому что изначально tot_num_days в таблице Building имеет значение NULL?
и прибавляя к NULL вы получаете NULL
3 май 19, 12:04    [21877283]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь! SQL  [new]
Kristina_29
Member

Откуда:
Сообщений: 3
Дмитрий Мух, вот какие значения в столбце изначально

К сообщению приложен файл. Размер - 121Kb
3 май 19, 12:12    [21877290]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь! SQL  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 3657
Kristina_29,

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

при добавлении записи (INSERT) в таблицу Assigment в deleted ничего нет и запрос
(select Num_days
from deleted
where deleted.Bldg_id = Building.Bldg_id)
возвращает NULL

Bычитая NULL из tot_num_days вы получаете NULL.
3 май 19, 12:19    [21877296]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь! SQL  [new]
invm
Member

Откуда: Москва
Сообщений: 9273
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;
3 май 19, 12:31    [21877306]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь! SQL  [new]
invm
Member

Откуда: Москва
Сообщений: 9273
Поправка
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;
3 май 19, 12:33    [21877309]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить