如何根据另一个表中两行的范围更新表中的行

时间:2015-08-26 23:32:14

标签: sql sql-server sql-server-2012

我自己正在研究这个问题,但我希望在此期间得到社区的一些意见。我有一个SQL Server 2012数据库,其中包含几个表:

折扣

Id    Quantity    DiscountAmount
--------------------------------
1     500         6
2     1000        8
3     1500        10

我有另一个名为Reviews的表,其中有数千个条目。该表的架构并不重要。

我想要做的是遍历Discounts表中的条目,并将UPDATE语句应用于Reviews表中该评论的行号的所有记录落在当前折扣行的数量和下一个数量-1之间。

所以在伪代码中:

For each row in the discount table order by quantity asc
BEGIN    
    UPDATE Review SET Discount=DiscountAmount WHERE [ROW NUMBER]
    BETWEEN Quantity[CURRENT_ROW] AND Quantity[NEXT_ROW]-1
END

实际上,这会将前499行的折扣金额设置为0(这是折扣的默认值),然后对于500-999,他们获得6的折扣,对于1000-1499,他们获得8和1500的折扣+他们可以获得10折优惠。

2 个答案:

答案 0 :(得分:2)

使用简单MAX:

<强> SqlFiddleDemo

/* Preparing data */
CREATE TABLE Review(id INT IDENTITY(1,1), val INT, discount INT NULL);

INSERT INTO Review(val)
VALUES (12), (400), (600), (1100), (1550);

CREATE TABLE Discount(Id INT IDENTITY(1,1), Quantity INT, DiscountAmount INT);

INSERT INTO Discount(Quantity, DiscountAmount)
VALUES (500, 6), (1000, 8), (1500, 10);


/* Main */
UPDATE rev
SET Discount = (SELECT ISNULL(MAX(d.DiscountAmount), 0) 
                FROM Discount d
                WHERE rev.val >= d.Quantity)
FROM Review rev;

答案 1 :(得分:1)

如果您只有4层折扣,您只需编写一个带有案例表达式的更新语句。

UPDATE Review 
 SET Discount = CASE 
                     WHEN Quantity < 500 THEN 0
                     WHEN Quantity >= 500 AND Quantity <= 999 THEN 6
                     WHEN Quantity >= 1000 AND Quantity <= 1499 THEN 8
                     WHEN Quantity >= 1500 THEN 10
                END