SQL - 更新查询仅更新一个字段

3

我正在尝试根据特定的条形码字段在我的Stock表上运行更新查询。

Stock表的模式如下所示:

enter image description here

我要运行的查询是:

Update tblStock set Quantity = Quantity + 10, Total = Quantity * PPrice where barcode = 'shandar'

执行此查询时,数量字段会得到更新,但总计字段保持不变,我想将数量乘以单价。
提前感谢。

1
Total = Quantity * PPrice refers to the existing value of Quanity as it is before the update. You need to do Total = (Quantity + 10) * PPrice - derpirscher
数量 = 数量 + 10 只需一次,之后我想将更新的数量值乘以 PPrice 值并根据条形码设置到总计中。 - SMHasnain
2个回答

4
对于您的情况,一旦第一列“数量”更新,更新语句就没有完成,但是它必须更新第二列“总计”。因此,它将从表中获取实际记录而不是已更新的记录。否则,您可以将其拆分为两个不同列的更新。
然后,您需要像这样操作:
因为,在更新表时,SQL Server会考虑之前的数据,直到代码成功执行且没有任何错误。
可以通过使用触发器使用插入和删除表查看这些经常更新/删除/插入的行/记录。
Update tblStock set Quantity = Quantity + 10, Total = (Quantity + 10)* PPrice 
where barcode = 'shandar'

Quantity = Quantity + 10 只执行一次,之后我想将更新后的数量值乘以 PPrice 值,并根据条形码设置到 Total 中。 - SMHasnain
1
对于您的情况,一旦第一列“数量”被更新,更新语句就没有完成,它必须更新第二列“总计”。因此,它从表中获取实际记录而不是更新后的记录。否则,您可以将其拆分为两个更新以针对不同的列。--@SMHasnain - Thiyagu
是的,那就是我刚才所做的。真的很奇怪,SQL不支持这种类型的查询,请更新您的答案,以便我可以给所有帮助过我的人点赞。 - SMHasnain

2
您可以使用CROSS APPLYFROM子句中定义新数量,然后使用该值:
Update s
    set Quantity = v.Quantity,
        Total = v.Quantity * s.PPrice
    from tblStock s cross apply
         (values (s.Quantity + 10)) v(quantity)
    where s.barcode = 'shandar';

重复简单的操作,例如quantity + 10并不是什么大问题。但是,如果计算更加复杂,那么最好只做一次。

话虽如此,您可能更适合使用total作为一个计算列。这样它就是正确的了,而且永远不需要更新。将其从表中删除,然后重新添加为:

alter table tblStock add total as ( quantity * pprice );

那么total的值总是正确的,因为它在查询表时计算。


数量 = 数量 + 10 只需一次,之后我想将更新的数量值乘以 PPrice 值并根据条形码设置到总计中。 - SMHasnain
@SMHasnain...我不明白你的意思。在这个答案中,“quantity + 10”只出现了一次。这就是这个答案的重点。 - Gordon Linoff
1
@SMHasnain……这个答案中的代码就是这样做的。我再重复一遍:quantity + 10只出现了一次,而不是两次。 - Gordon Linoff
@SMHasnain...这里有一个db<>fiddle,仅用于说明代码可以编译:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=e830c8ba9e31b7e36f12f67b93fffffe。 - Gordon Linoff
你是正确的,这段代码在 Fiddle 上编译通过,我认为这是版本问题,因为我正在使用 SQLServer 2012,但这变得非常有趣,因为你教会了我一件新事情。 - SMHasnain
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接