2010-02-08 74 views
0

我在我的一個表中有一列,它被假設爲來自多個表的行的總和。有沒有辦法我可以有一個默認查詢在總和列上運行,以便每次將一行添加到另一個表時,在總和列中進行更新。爲表中的列創建默認查詢(SQL)?

感謝

回答

1

要更新的每個其他表中的列的一個時間總和列被改變?然後觸發器可以爲您的目的服務。

Create Trigger For Insert, Update, Delete 
    On OtherTable 
    As 
     Update SumTable Set 
      SumColumn = 
       (Select Sum(Column) 
       From OtherTable 
       Where something = s.Something) 
     From SumTable s 
     Where Something In 
      (Select Distinct something From inserted 
       Union 
      Select Distinct Something From deleted) 

或者,你可以將代碼從一個插入或更新的代碼刪除通過編寫單獨的觸發器被分開,或:

Create Trigger For Insert, Update, Delete 
    On OtherTable 
    As 
     If Exists(Select * From inserted) And Update(Column) 
      Update SumTable Set 
       SumColumn = 
        (Select Sum(Column) 
        From OtherTable 
        Where something = s.Something) 
      From SumTable 
      Where Something In 
       (Select Distinct Something 
       From Inserted) 
     Else If Exists(Select * From deleted)    
      Update SumTable Set 
       SumColumn = 
        (Select Sum(Column) 
        From OtherTable 
        Where something = s.Something) 
      From SumTable 
      Where Something In 
       (Select Distinct Something 
       From deleted) 
+0

嘿查爾斯感謝您的答案,但我不知道我明白你在做什麼之後在哪裏。 凡東西 (SELECT DISTINCT東西從插入 聯盟 SELECT DISTINCT一些東西刪除) – Shino88

+0

由於我使用的是單觸發兩個更新/插入和刪除,where子句是限制的更新,只有那些行,其中在正在插入,更新或刪除的行中存在something列的值...這會阻止觸發器更新SumTable中每行的SumColumn,並且只更新需要更新的行(子節點行已被插入,更新或刪除) - 我已經添加了separte代碼塊來單獨處理這兩個場景 –

2

你可能想看看使用視圖,而不是對這樣的表,像下面可能會有幫助。

Select table.*, sum(otherTable.column) 
from table 
inner join otherTable on table.something = otherTable.something 
1

正如查爾斯說,觸發效果很好在這情況。如果來自其他表格的行總數經常變化,我不確定觸發器是否會導致性能問題。還有兩種方法:

視圖 - 視圖本質上是一個保存的查詢,並且您就像查詢表一樣查詢它。如果彙總數據僅適用於報告類型的內容,則最好從主表中刪除彙總列並使用視圖進行報告

存儲過程 - 如果您希望將列保留在主表中,您可以定期運行一個存儲過程,以保持所有行的總額信息都是最新的。

+0

我特意爲upvoted關於視圖的註釋:不要使用觸發器。 –

0

我會比較視圖的想法和觸發想法之間的性能之前決定使用。針對您期望視圖的完整數據集執行此操作,而不僅僅是一小組測試數據。如果可能,請確保爲視圖編制索引。