我有一个带有两个表的SQL Server 2008数据库。第一个表叫做Department。第二个表称为Ticket。这两个表定义如下:
Department
----------
ID
Name
TotalTickets
Ticket
------
ID
DepartmentID
Description
AssignedTo
我正试图找出一种动态更新Department.TotalTickets值的方法。添加或删除故障单时,我想自动增加或减少TotalTickets的值。有人可以告诉我在SQL Server 2008上执行此操作的最佳方法吗?
谢谢
答案 0 :(得分:2)
有很多方法可以实现这一点,您可以在票证表上插入或删除后使用触发器,或者可以从部门中取出TotalTickets
并将其放在视图中。
CREATE VIEW viewDepartmentTickets
AS
SELECT d.Id, d.Name, Sum(t.ID) As TotalTickets
FROM Department d
LEFT OUTER JOIN Ticket t ON t.departmentid = d.departmentid
GROUP BY d.Id, d.Name
如果性能有问题,您可以将视图创建为indexed view,因为Thomas指出连接需要是INNER JOIN
,表名需要采用{{1}格式你必须创建视图dbo.Department
以沿着这条路走下去。
视图将在插入/删除票证时更新。
答案 1 :(得分:1)
一种解决方案是使用Triggers更新TotalTickets
,INSERT
或UPDATE
来自您的DELETE
行表
您还可以创建View,以便使用聚合函数计算Tickets
列。这是一种更加规范化的方法,因为您不会在表中存储计算字段。
答案 2 :(得分:1)
将TotalTickets列更改为计算列,创建一个udf,根据部门ID计算TotalTickets,并将TotalTickets值设置为此udf。
这样你既不需要三个触发器也不需要两个命令。
在这里查看示例:Using UDFs in Computed Columns
您也可以使用带有计算列的索引,如其他答案中所述。
答案 3 :(得分:0)
您应该在事务中插入Ticket表和Department表:
Begin Tran
Insert Ticket(Id...)
Values(@DepartmentId, ...)
Update Department
Set TotalTickets = TotalTickets + 1
Where Id = @DepartmentId
Commit Tran
这显然是一个简单的例子。在实际情况中,您可能希望添加Try-Catch块并在发生错误时调用Rollback Tran。
答案 4 :(得分:0)
如果您想自动执行此操作,那么触发器是您最好的选择。
您可以在触发器中执行两种操作:
您在INSERT和DELETE上的触发器可以
OR
答案 5 :(得分:0)
只需使用它可以按照您的需要执行的触发器。非常快,但在生产中部署之前一定要调试好触发器。