1

別のテーブルで選択した行から列を合計する計算列を効果的に追加したいと思います。合計を再計算せずに、計算列の値をすばやく取得して検索する必要があります。

追加したい計算列は、Dream-SQL では次のようになります。

ALTER TABLE Invoices ADD Balance
AS SUM(Transactions.Amount) WHERE Transactions.InvoiceId = Invoices.Id

もちろん、これはうまくいきません。私の理解では、別のテーブルを参照する計算列を追加することはできません。ただし、インデックス付きビューにはそのような列を含めることができるようです。

このプロジェクトは、Entity Framework Code First に基づいています。アプリケーションは、ゼロ以外の残高をすばやく見つける必要があります。

インデックス付きビューを使用すると仮定すると、それを Invoices および Transactions テーブルと統合して LINQ to Entities で簡単に使用できるようにする最善の方法は何ですか? インデックス付きビューには、Invoices テーブルのすべての列を含める必要がありますか?それとも残高 (保持されるもの) だけを含める必要がありますか? 推奨されるビューとインデックスを作成するための SQL のコード スニペットが役立ちます。

4

1 に答える 1

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としてマークするとDatabaseGeneratedOption.Computed、請求書の行を追加するときに EF が値を提供しないため、列に既定値の 0 を提供することも役立ちます。

于 2014-05-18T12:47:26.037 に答える