【发布时间】:2015-02-03 03:10:35
【问题描述】:
我有一个 select 语句,每次它与表 real_values 上的值不匹配时,它都会向我显示原始表中的所有数据。
因此,每次不匹配时,我希望查询使用正确的值更新它,而不是向我显示哪些路由的容量值错误。
以下是一个较短的版本,可用作示例: http://sqlfiddle.com/#!4/6a904/1
我如何才能更新值,而不是选择语句?我尝试了一些我在网上看到的东西,但似乎没有任何效果。
【问题讨论】:
我有一个 select 语句,每次它与表 real_values 上的值不匹配时,它都会向我显示原始表中的所有数据。
因此,每次不匹配时,我希望查询使用正确的值更新它,而不是向我显示哪些路由的容量值错误。
以下是一个较短的版本,可用作示例: http://sqlfiddle.com/#!4/6a904/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 更具可读性和更易于使用。
【讨论】:
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。
【讨论】:
set (value1, value2) = (select value1, value2 from...
在 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);
【讨论】: