在另一个中保留一个 table 的记录数

Keep count of records of one table in another

我有一个 table 里面有记录,客户购买信息 (table a)。我想做一个参考 table (table b),它通过 运行 对 table a 的计数来跟踪每个人购买了多少商品。因此,假设客户 1 进行了 15 次购买,存储在 Table A 中,Table B 将具有客户姓名,然后显示他们 15 次购买的计数。想知道解决这个问题的最佳方法。谢谢!

将此信息反规范化为单独的 table 是个坏主意。您冒着更新异常的风险,并且需要编写复杂且低效的触发代码以使其保持最新。

您可以为此创建一个视图。你最好的选择是索引视图,服务器将为你维护它,并允许高效查询。

索引视图(相对于普通视图)的主要限制是:

  • 只允许内部联接,不允许应用或子查询或派生 tables 或 CTE。
  • 允许分组,但必须包含 COUNT_BIG(*),唯一允许的其他聚合是 SUM
  • 必须是 schema-bound(所有 two-part table 的引用,基础列没有变化)
CREATE OR ALTER VIEW dbo.TotalPurchase
WITH SCHEMABINDING
AS

SELECT
  p.CustomerId,
  NumPurchases = COUNT_BIG(*),
  PurchaseAmount = SUM(p.Amount)
FROM dbo.Purchase p
GROUP BY
  p.CustomerId;

go
CREATE UNIQUE CLUSTERED INDEX IX_TotalPurchase
  ON TotalPurchase (CustomerId)
  WITH (DROP_EXISTING = ON);

您现在可以像查询普通视图一样查询此视图 table,服务器将确保它在 real-time 中保持最新。

出于各种原因,我建议在查询时使用 NOEXPAND 提示。

SELECT *
FROM TotalPurchase tp WITH (NOEXPAND);