2008-10-09 38 views
0

在SQL语言或MySQL(或其他DBMA)中是否有任何方式将值从一个单元格传输到另一个单元格?例如,假设有一个名为user_cars结构如下表:任何方式将值从一个单元转移到另一个单元?

|id| |user_name| |num_cars| 

鲍伯有5辆,John有3辆汽车。有没有什么办法可以在一个查询中从Bob中减去2辆汽车并将John加2?我知道这可以用两个更新查询完成,但我只想知道是否有更有效的方法。

回答

4

对于Oracle你可以这样做。不知道在mysql中是否有等价物。显然这个特别的陈述是非常具体的你说的例子。

UPDATE user_cars 
    SET num_cars = num_cars + 
        CASE WHEN user_name='Bob' THEN -2 
          WHEN user_name='John' THEN +2 
        END 
    WHERE user_name IN ('Bob', 'John') 
0

如果你真的想这样做,在一个查询中,你可以做一个自我更新加入的表,但它是二者的可读性,可能效率较低。

2

这是可行的,但它是不愉快:

UPDATE USER_CARS UC 
SET 
    NUM_CARS = NUM_CARS + CASE WHEN UC.USER_NAME = 'Bob' 
          THEN -2 --take from bob 
          WHEN UC.USER_NAME = 'John' 
          THEN 2 --give to John 
          ELSE 0 --no change for anybody else 
         END 
+0

您应该仍然使用WHERE子句来限制正在更新的行数(仅限于Bob和John)。将零结果添加到相同的值中,但仍将计入事务日志,触发器等的更改中。行数多的表会导致性能下降。 – JeremyDWill 2008-10-09 19:43:33

0

我乔纳斯Klemming同意,有isn't这样做的一种有意义的方式。这正是发明交易的原因。

1

正如其他人已经解释,你可以做一个CASE声明。
但是,这样做可能是不明智的,因为它使代码的意图难以看清。这将使后续程序员更难理解代码的用途。

除非您有一些具体原因需要在一个语句中完成,否则最好的做法是使用2个更新语句,如果需要将它们包装在事务中。

我常常回想起这段话(虽然我不得不寻找在wikiquote的归属):

“程序必须写入供人阅读,而只是附带的机器来执行。” - Abelson & Sussman,SICP,第一版前言

相关问题