SQL - 根据另一个 table 中的值更新 table 值
SQL - Update table values from values in another table
我有一个 select 语句,每次它与 table real_values 上的值不匹配时,它会向我显示来自 table 原始数据的所有数据。 14=]
所以每次它不匹配时,我希望查询用正确的值更新它,而不是向我显示哪些路线的容量值错误。
这里是一个较短的版本,用作示例:
http://sqlfiddle.com/#!4/6a904/1
不是 select 语句,我怎么能只更新值呢?我已经尝试了一些我在网上看到的东西,但似乎没有任何效果。
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
,但您的 fiddle link 使用 MySQL.
在SQL服务器中,你会这样做
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);
@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
在您想要更新多列时更易读且更易于使用。
我有一个 select 语句,每次它与 table real_values 上的值不匹配时,它会向我显示来自 table 原始数据的所有数据。 14=]
所以每次它不匹配时,我希望查询用正确的值更新它,而不是向我显示哪些路线的容量值错误。
这里是一个较短的版本,用作示例: http://sqlfiddle.com/#!4/6a904/1
不是 select 语句,我怎么能只更新值呢?我已经尝试了一些我在网上看到的东西,但似乎没有任何效果。
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
,但您的 fiddle link 使用 MySQL.
在SQL服务器中,你会这样做
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);
@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
在您想要更新多列时更易读且更易于使用。