触发更新另一个表,其中包含原始表

时间:2015-07-11 14:33:42

标签: sql sql-server sql-server-2008 sql-server-2008-r2

我有一个Project表: enter image description here

和里程碑表: enter image description here

每当对Milestone表进行任何插入,更新,删除时,Project表都需要更新。

Project表中的ProjectCost列是其里程碑的总和。 Milestone表具有ProjectId列,用于指示哪个项目属于里程碑。

每次对里程碑表进行任何更改时,都应更新Product表中的ProductCost。

我在触发器中遇到问题:

CREATE TRIGGER UpdateProject 
   ON  [Organisation].[dbo].[Milestone] 
   AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
    UPDATE T1
    SET T1.ProjectCost = (SELECT SUM(MilestoneCost) FROM [Organisation].[dbo].[Milestone] T2 
                            WHERE T2.ProjectId=)
    FROM [Organisation].[dbo].[Project] T1
    INNER JOIN Inserted i ON T1.ProjectId=i.ProjectId
    WHERE T1.ProjectId=

END
GO

触发器应该如何?

修改

我将触发器编辑为:

USE Organisation
GO

CREATE TRIGGER [UpdateProject]
   ON  [Organisation].[dbo].[Milestone] 
   AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
    UPDATE T1
    SET T1.ProjectCost = (SELECT SUM(MilestoneCost) 
                            FROM [Organisation].[dbo].[Milestone] T2 
                            WHERE T2.ProjectId=i.ProjectId)
    FROM [Organisation].[dbo].[Project] T1
    INNER JOIN Inserted i ON T1.ProjectId=i.ProjectId
END
GO

1 个答案:

答案 0 :(得分:1)

你非常接近:

BEGIN
    UPDATE T1
        SET T1.ProjectCost = (SELECT SUM(MilestoneCost)
                              FROM [Organisation].[dbo].[Milestone] T2 
                              WHERE T2.ProjectId = i.ProjectId
                             )
    FROM [Organisation].[dbo].[Project] T1 INNER JOIN
         Inserted i
         ON T1.ProjectId = i.ProjectId;
END;

外部查询中的joinwhere中的相关性会执行您想要的过滤。