我正在尝试为一个名为B的表构建一个触发器。当行插入B时,触发器将触发,并在另一个表(称为F)中将列减1(称为席位,从10开始)。
我的问题是我被迫使用插入联合插入B,并且触发器仅为每个键更新F中的相关列,而不是每插入一行。
我的表格看起来像这样
B F
------------------ ------------------
CODE DATE id CODE DATE seats
所以代码和日期是两个表之间的相关外键。
我必须遵循的插入语句的一个例子是
Insert into B;
select 'JA100','11/30/16',81108 union
select 'JA110','11/28/16',38003 union
select 'JA110','11/28/16',87822 union
select 'JA130','11/28/16',33850 union
select 'JA100','11/30/16',69696 union
select 'JA100','11/30/16',75657 union
我写过的触发器是
BEGIN
IF EXISTS (SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)
BEGIN
UPDATE F
SET seats = seats - 1
FROM F F, inserted I
WHERE I.code = F.code AND I.date = F.date
END
我最终得到的是所有三个F的座位栏中的9,JA100应为7,JA110为8,JA130为9.
如何解决这个问题呢?谢谢你的时间。
答案 0 :(得分:0)
您必须按每个ID /日期汇总座位,并从跟踪座位数的表中减少汇总。
下面更新了触发器的版本。另请参阅http://sqlfiddle.com/#!18/bb0da/1了解工作示例。
create trigger insert_DecrementSeats on b
for insert
as
begin
;WITH seatsAggregated AS (
SELECT [code], [date], COUNT(*) AS seats
FROM
inserted i
GROUP BY [code], [date]
) UPDATE f
SET f.seats = f.seats - a.seats
FROM
f
INNER JOIN seatsAggregated a ON f.[code] = a.[code] AND f.[date] = a.[date]
end
go