Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich die Tabelle tblPurchase und tblProductStock ohne Drop behalten? (Ich muss sowohl die Tabelle als auch den Wert dauerhaft ohne Tropfen halten)

Indizierte Ansicht

Eine völlig neue Lösung basierend auf Indizierte Ansichten ist möglich.

Eine indizierte Ansicht ist eine Ansicht, die einen geclusterten Index enthält, und die Daten werden tatsächlich auf der Festplatte gespeichert.

Soweit ich weiß, versuchen Sie, eine Summe der Einkäufe pro Produktelement in tblProduct zu speichern . Ich habe angenommen, dass ItemCode ist die PK von tblProduct und diesem ItemName ist auch dort definiert (Wir können MAX nicht verwenden in einer indizierten Ansicht). Wir können also eine Ansicht wie folgt definieren:

CREATE VIEW dbo.vwTotalPurchases
WITH SCHEMABINDING  -- must be schema bound, we cannot change underlying columns after creation
AS
SELECT
   ItemCode,
   SUM(Quantity) QuantityPurchased,
   COUNT_BIG(*) CountPurchases  -- if we group, must have count also, so that rows can be maintained
FROM dbo.tblPurchase  -- must use two-part names
GROUP BY itemCode;
GO

Wir können dann einen gruppierten Index darauf erstellen, um ihn auf der Festplatte zu speichern. SQL Server verwaltet den Index bei jeder Aktualisierung der Basistabelle. Wenn es keine Zeilen mehr in der Gruppierung gibt (gekennzeichnet durch den Zählerstand 0), wird die Zeile gelöscht:

CREATE UNIQUE CLUSTERED INDEX PK_vwTotalPurchases ON dbo.vwTotalPurchases (ItemCode);
GO

Wenn wir es jetzt abfragen wollen, können wir diese Ansicht links mit tblProducts verknüpfen (beitreten links, da möglicherweise keine Käufe vorhanden sind):

SELECT
    p.ItemCode,
    p.ItemName,
    ISNULL(tp.QuantityPurchased, 0) QuantityPurchased,
    ISNULL(tp.CountPurchases, 0) CountPurchases
FROM tblProducts p
LEFT JOIN vwTotalPurchases tp WITH (NOEXPAND) ON tp.ItemCode = p.ItemCode;

Wir können dies auch als Ansicht definieren (keine indizierte Ansicht, sondern eine Standardansicht), sodass die Definition überall verwendbar ist.

Hinweis zu NOEXPAND :

Wenn Sie nicht SQL Server Enterprise oder Developer Edition verwenden, müssen Sie den Hinweis WITH (NOEXPAND) verwenden um es zu zwingen, den Index zu verwenden, sonst wird es die Basis tblPurchase abfragen stattdessen. Und selbst in diesen Editionen ist es am besten, NOEXPAND zu verwenden .

Siehe diesen Artikel von Paul White dazu.