我想有效地添加一个计算列,该列对另一个表中选定行的列进行求和。我需要快速检索并搜索计算列中的值,而无需重新计算总和。
我想添加的计算列在Dream-SQL中看起来像这样:
ALTER TABLE Invoices ADD Balance
AS SUM(Transactions.Amount) WHERE Transactions.InvoiceId = Invoices.Id
当然,这不起作用。我的理解是您无法添加引用另一个表的计算列。但是,索引视图似乎可以包含这样的列。
该项目基于实体框架代码优先。应用程序需要快速找到非零余额。
假设索引视图是要走的路,将它与Invoices和Transactions表集成的最佳方法是什么,以便与LINQ to Entities一起使用?索引视图是否应包含“发票”表中的所有列,还是仅包含“余额”(保留的内容)?用于创建推荐视图和索引的SQL代码片段会很有帮助。
答案 0 :(得分:2)
索引视图不起作用,因为它只会对GROUP BY子句中的表达式进行索引,这意味着它无法对总和进行索引。计算列不起作用,因为总和不能保留或编入索引。
然而,触发器有效:
CREATE TRIGGER UpdateInvoiceBalance ON Transactions AFTER INSERT, UPDATE AS
IF UPDATE(Amount) BEGIN
SET NOCOUNT ON;
WITH InvoiceBalances AS (
SELECT Transactions.InvoiceId, SUM(Transactions.Amount) AS Balance
FROM Transactions
JOIN inserted ON Transactions.InvoiceId = inserted.InvoiceId
GROUP BY Transactions.InvoiceId)
UPDATE Invoices
SET Balance = InvoiceBalances.Balance
FROM InvoiceBalances
WHERE Invoices.Id = InvoiceBalances.InvoiceId
END
为Balance
列提供默认值0也很有帮助,因为当您将其标记为DatabaseGeneratedOption.Computed
时,EF在添加发票行时不会为其提供任何值。