SQL - 从另一个表中的值更新表值

时间:2015-02-02 17:40:43

标签: sql oracle oracle11g

我有一个select语句,每当它与表real_values上的值不匹配时,它会向我显示表原始数据。

因此,每次它不匹配时,我希望查询使用正确的值更新它,而不是向我显示哪些路由的容量值是错误的。

以下是一个较短的版本作为示例: http://sqlfiddle.com/#!4/6a904/1

我怎样才能更新值?而不是select语句?我尝试了一些我在网上看过的东西,但似乎没什么用。

3 个答案:

答案 0 :(得分:1)

Oracle中此类更新查询的常见形式如下:

UPDATE table1 t1
   SET t1.value = ( SELECT t2.value FROM table2 t2
                     WHERE t2.key = t1.key )
 WHERE EXISTS ( SELECT 1 FROM table2 t2
                 WHERE t2.key = t1.key );

我很困惑。您已标记此问题oraclesql-server,但您的小提琴链接使用MySQL。

答案 1 :(得分:1)

@ DavidFaber的回答是大多数人会这样做的。但是,对于此类查询,我更倾向于使用merge而不是update

MERGE INTO original o
USING      real_values rv
ON         (o.origin = rv.origin AND o.destination = rv.destination)
WHEN MATCHED THEN
   UPDATE SET
      o.capacity_wt = rv.capacity_wt, o.capacity_vol = rv.capacity_vol
      WHERE         o.capacity_wt != rv.capacity_wt
                 OR o.capacity_vol != rv.capacity_vol

(我不清楚你的问题是否要更新originalreal_values,所以我选择了一个。如果我弄错了,倒转它应该是微不足道的。)

当您想要更新多个列时,我发现merge更易读,更易于使用。

答案 2 :(得分:0)

在SQL Server中,您可以这样做

update original set capacity_wt=b.capacity_wt,capacity_vol=b.capacity_vol
from original a, real_values b
where a.origin = b.origin 
and a.destination = b.destination 
and (a.capacity_wt != b.capacity_wt
or b.capacity_vol != b.capacity_vol);