在另一个中保留一个 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);
我有一个 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);