免责声明:这个问题最初是在 SO 上被问到的,但在那里并没有太大的吸引力,所以我在这里尝试,希望它对 DBA 更有趣......
我们正在开发一个电子商务系统,在该系统中我们汇总来自不同卖家的订单。正如您可以轻松想象的那样,我们有一个Order包含所有卖家订单数据的表格。每个卖家都有一个唯一的AccountID,它是Order表中的外键。
我们希望为进入系统的每个订单生成一个订单号,以便对于给定的卖家(和给定AccountID),这些订单号正在创建一个序列(第一个订单获得 1,然后是 2,然后是 3 等)。
我们已经尝试了几种解决方案,但它们有我们想要避免的缺点。所有这些都在触发器中:
ALTER TRIGGER [dbo].[Trigger_Order_UpdateAccountOrderNumber]
ON [dbo].[Order]
AFTER INSERT
BEGIN
...
END
Run Code Online (Sandbox Code Playgroud)
我们的解决方案 1是:
UPDATE
[Order]
SET
AccountOrderNumber = o.AccountOrderNumber
FROM
(
SELECT
OrderID,
AccountOrderNumber =
ISNULL((SELECT TOP 1 AccountOrderNumber FROM [Order] WHERE AccountID = i.AccountID ORDER BY AccountOrderNumber DESC), 1) +
(ROW_NUMBER() OVER (PARTITION BY i.AccountID ORDER BY i.OrderID))
FROM
inserted AS i
) AS o
WHERE [Order].OrderID …Run Code Online (Sandbox Code Playgroud)