sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag behålla tblPurchase och tblProductStock-tabellen utan att tappa. (Jag måste behålla både tabell och värde permanent utan släpp)

Indexerad vy

En helt ny lösning baserad på Indexerade vyer är möjligt.

En indexerad vy är en vy som har ett klustrat index, och data lagras faktiskt på disken.

Som jag förstår det försöker du hålla en summa av köp per produktvara lagrad i tblProduct . Jag har antagit att ItemCode är PK för tblProduct och det ItemName är också definierad där (Vi kan inte använda MAX i en indexerad vy). Så vi kan definiera en vy så här:

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

Vi kan sedan skapa ett klustrat index på det för att bevara det på disken. SQL Server kommer att behålla indexet när en uppdatering av bastabellen sker. Om det inte finns fler rader i grupperingen (identifieras genom att antalet är 0), raderas raden:

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

Om vi ​​nu vill fråga det, kan vi lämna den här vyn till tblProducts (vänster gå med eftersom det kanske inte blir några köp):

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;

Vi kan definiera detta som en vy också (inte en indexerad, utan en standardvy) så att definitionen är användbar var som helst.

Anmärkning om NOEXPAND :

Om du inte använder SQL Server Enterprise eller Developer Edition måste du använda tipset WITH (NOEXPAND) för att tvinga den att använda indexet, annars kommer den att fråga basen tblPurchase istället. Och även i dessa utgåvor är det bäst att använda NOEXPAND .

Se denna artikel av Paul White om detta.




  1. Kunde inte hitta server 'DB-namn' i sys.servers (inte dbo-problem)

  2. Hur man aktiverar/inaktiverar CHECK-begränsningar i SQLite

  3. Replikering från MySQL till MS SQL

  4. Hur kan jag aktivera MySQL:s långsamma frågelogg utan att starta om MySQL?