Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để giữ bảng tblPurchase và tblProductStock mà không bị rớt. (Tôi cần giữ cả bảng và giá trị vĩnh viễn mà không bị rớt)

Chế độ xem được lập chỉ mục

Một giải pháp hoàn toàn mới dựa trên Chế độ xem được lập chỉ mục là có thể.

Chế độ xem được lập chỉ mục là chế độ xem có chỉ mục nhóm trên đó và dữ liệu thực sự được lưu trữ trên đĩa.

Theo tôi hiểu, bạn đang cố gắng lưu trữ tổng số lần mua cho mỗi mặt hàng sản phẩm trong tblProduct . Tôi đã giả định rằng ItemCode là PK của tblProduct và ItemName đó cũng được xác định ở đó (Chúng tôi không thể sử dụng MAX trong một chế độ xem được lập chỉ mục). Vì vậy, chúng ta có thể xác định một dạng xem như sau:

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

Sau đó, chúng ta có thể tạo một chỉ mục nhóm trên đó để duy trì nó trên đĩa. SQL Server sẽ duy trì chỉ mục bất cứ khi nào xảy ra cập nhật bảng cơ sở. Nếu không còn hàng nào trong nhóm (được xác định bằng số lượng là 0), thì hàng đó sẽ bị xóa:

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

Bây giờ nếu chúng ta muốn truy vấn nó, chúng ta có thể kết hợp chế độ xem này vào tblProducts (rời tham gia vì có thể không có giao dịch mua):

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;

Chúng tôi cũng có thể định nghĩa đây là một chế độ xem (không phải là một chế độ xem được lập chỉ mục, mà là một chế độ xem chuẩn) để định nghĩa này có thể sử dụng được ở mọi nơi.

Ghi chú trên NOEXPAND :

Nếu bạn không sử dụng SQL Server Enterprise hoặc Developer Edition, bạn phải sử dụng gợi ý WITH (NOEXPAND) để buộc nó sử dụng chỉ mục, nếu không nó sẽ truy vấn cơ sở tblPurchase thay vì. Và ngay cả trong các phiên bản đó, tốt nhất là sử dụng NOEXPAND .

Xem bài viết này của Paul White về điều này.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn con của SQL Server trả về nhiều hơn 1 giá trị. Điều này không được phép khi truy vấn con theo sau =,! =, <, <=,>,> =

  2. Có cách nào để hiển thị kết quả PRINT với trình điều khiển JDBC của máy chủ SQL không?

  3. COUNT () so với COUNT_BIG () trong SQL Server:Sự khác biệt là gì?

  4. Tạo dữ liệu kiểm tra thời gian SQL Server 2008 ngẫu nhiên

  5. JDBC SQLServerException:Trình điều khiển này không được định cấu hình để xác thực tích hợp.