在触发器中更新主表资料的简单的SQL语句!(100分)

  • 主题发起人 主题发起人 lccc
  • 开始时间 开始时间
L

lccc

Unregistered / Unconfirmed
GUEST, unregistred user!
主表Customers有一个字段YearBuySum(理论上是冗余的,为了方便而已),
从表CustBuyHistory有一个字段BuyNum,每次增加、修改、删除一条从表
记录,使用触发器在后台自动修改YearBuySum字段的值。
目前的使用的方法是在触发器中定义两个游标:
DECLARE InsCur CURSOR--用于累加新的值,新插入的行或修改行将使用。
FOR SELECT CustID,BuyNum FROM Inserted
DECLARE DelCur CURSOR--用于减去旧的值,删除行或修改行将使用。
FOR SELECT CustID,BuyNum FROM Deleted
然后使用FETCH INTO 取出每个用户的代码、买量累加或累减。

上述触发器的SQL代码很长,能否使用一句UPDATE语句来完成这个过程??
 
當然可以:

放在表CustBuyHistory的觸發器中:這是為Update動作寫的
update Customers set YearBuySum=a.YearBuySum+i.BuyNum-d.BuyNum
from Customers a , inserted i , deleted d where a.CustID=i.CustID and i.CustID=d.CustID
--在此用CustID作為表Customers與CustBuyHistory的關聯關鍵字
 
对于UPDATE,由于Inserted表和Deleted表的记录
是相同的,比较好控制。但能否对INSERT、UPDATE、
DELETE使用统一的触发器来累加和递减呢?虽然它
们的Inserted表和Deleted表的记录不对应。
谢谢!
 
對INSERT、UPDATE、DELETE全部適用:(注:IsNull函數不必須保留不能刪除)
update Customers set YearBuySum=a.YearBuySum+IsNull(i.BuyNum,0)-IsNull(d.BuyNum,0)
from Customers a
left join inserted i on a.CustID=i.CustID
left join deleted d on a.CustID=d.CustID
--在此用CustID作為表Customers與CustBuyHistory的關聯關鍵字
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部