Sql server 在SQL Server中更新计算出的排名

Sql server 在SQL Server中更新计算出的排名,sql-server,sql-server-2012,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 这里我的要求是,无论何时用户输入金额竞价水平都是动态的 就像任何用户输入金额为5一样,他将成为L1 以及所有其他类似于诺基亚L2 Mac L3 Apple L4的功能。首先,

这里我有一个像biddin db structor一样的需求

Id   Name       Amount    Bidding_Level
1     Apple      50         L3
2     Mac        30        L2
3     Nokia      10        L1
这里我的要求是,无论何时用户输入金额竞价水平都是动态的 就像任何用户输入金额为5一样,他将成为
L1

以及所有其他类似于诺基亚L2 Mac L3 Apple L4的功能。首先,正如Damien所建议的,这个值不应该存储,而是在需要时计算。当您计算了列(不会自动更新)之后,您请求执行额外的维护任务(如果有人更改了产品名称但保留了相同的ID,以及有人删除了出价,会发生什么情况?)和无意义的处理(在实际需要当前出价级别之前,您可以计算出价级别并接收另一个出价)

这就是说,您可以使用触发器重置出价排名,这必须在插入、更新或删除之后进行(您不太解释您的业务逻辑)


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

似乎可以从“金额”列中计算出价级别。因此,您可能不应该存储此值,而是根据需要计算。存储计算数据只会导致存储值与基础数据不一致的可能性。@Damien_the_r是基于金额,应根据金额生成投标级别
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