如何在触发器内执行计数功能?

时间:2017-03-20 13:24:38

标签: sql sql-server

我目前正在尝试创建一个触发器,它会更新另一个表中列中的值,但我尝试的每次尝试都不起作用。我的设置是这样的,每次客户地址在customer表中更新时,表customer audit都会更新customer表,从我要更新addresschangedcount的审计表中customer表中的列,每次在审计表中更改地址时按客户ID进行分组,到目前为止,我的代码是这样的,但它没有更新customer表:

create trigger Attempt3Advanced
on CustomerAudit
after update
as
if (update (AddressChangedCount))
begin
    UPDATE tblCustomer
    SET    tblCustomer.AddressChangedCount = inserted.AddressChangedCount
    FROM   tblCustomer
    JOIN inserted
        ON tblCustomer.AddressChangedCount = inserted.AddressChangedCount
end

有谁能告诉我哪里出错了,如果可能的话会提供一些解决方案?

1 个答案:

答案 0 :(得分:0)

首先:您不应该从审计表中更新真实的表。

并且您不应该冗余地存储数据。您只需查找审计表即可确定对该地址所做的更改次数。然后您的代码会在审计表中显示一个字段AddressChangedCount。这是为什么?地址数是否已更改为审计表中的地址更改记录数?

最后您要更新客户的地址更改计数,但您不会查找客户的记录,而是查找具有相同计数的记录:

ON tblCustomer.AddressChangedCount = inserted.AddressChangedCount

我的建议:完全删除计数字段。如果你想要一个计数,那就算了。像这样:

select c.customer_id, coalesce(ca.cnt, 0)
from tblcustomer c
left join
(
  select customer_id, count(*) as cnt
  from customeraudit
  where coalesce(old_address, '') <> coalesce(new_address, '')
) ca on ca.customer_id = c.customer_id;