保持计算排名在SQL-Server中更新

时间:2018-05-14 07:12:34

标签: sql-server sql-server-2012

这里我有一个像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

1 个答案:

答案 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

请注意,跳跳器会考虑表格的所有记录,因为它必须更新任何金额的每次更改的所有记录(这对性能非常不利)。您应该在每次需要时计算此排名。