如何使用插入联合

时间:2018-03-30 02:46:04

标签: sql sql-server triggers insert union

我正在尝试为一个名为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.

如何解决这个问题呢?谢谢你的时间。

1 个答案:

答案 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