我有一个select语句,每当它与表real_values上的值不匹配时,它会向我显示表原始数据。
因此,每次它不匹配时,我希望查询使用正确的值更新它,而不是向我显示哪些路由的容量值是错误的。
以下是一个较短的版本作为示例: http://sqlfiddle.com/#!4/6a904/1
我怎样才能更新值?而不是select语句?我尝试了一些我在网上看过的东西,但似乎没什么用。
答案 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 );
我很困惑。您已标记此问题oracle
和sql-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
(我不清楚你的问题是否要更新original
或real_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);