这里我有一个像biddin db structor一样的要求
Id Name Amount Bidding_Level
1 Apple 50 L3
2 Mac 30 L2
3 Nokia 10 L1
此处我的要求是每当用户输入金额 Bidding_Level 变为动态时
就像任何用户输入金额为5他将成为L1
And all other Like as Nokia L2 Mac L3 Apple L4
答案 0 :(得分:1)
首先,正如达米恩所说,似乎不应该存储这个值,而是在需要时进行计算。如果您有计算列(不会自动更新),那么您要求其他维护任务(如果有人更改了产品名称但保留了相同的ID,会发生什么情况?当有人删除时出价?)和无意义处理(您可以在实际需要当前出价水平之前计算出价水平并收到其他出价。)
话虽这么说,您可以使用触发器重置出价排名,该触发器必须在插入,更新或删除之后(您不必详细解释您的业务逻辑)。
CREATE TRIGGER tr_SetBiddingLevel ON Bids AFTER INSERT, UPDATE, DELETE
AS
BEGIN
-- If the amount was updated, a new row was added or a row was deleted
IF UPDATE(Amount) OR (
EXISTS (SELECT 1 FROM deleted) AND
NOT EXISTS (SELECT 1 FROM inserted))
BEGIN
;WITH NewBidLevels AS
(
SELECT
B.Id,
NewBidLevel = ROW_NUMBER() OVER (ORDER BY B.Amount ASC)
FROM
Bids AS B
)
UPDATE B SET
Bidding_Level = 'L' + CONVERT(VARCHAR(10), N.NewBidLevel)
FROM
Bids AS B
INNER JOIN NewBidLevels AS N ON B.Id = N.Id
END
END
请注意,跳跳器会考虑表格的所有记录,因为它必须更新任何金额的每次更改的所有记录(这对性能非常不利)。您应该在每次需要时计算此排名。