update t1 a set a.age= (select b.age from t2 b where a.name = b.name ) where a.age is null;语句如上,t1表和t2表都有name和age字段,而且t1表中的一个name对应t2表中的一个name,现在想把t1表中age字段值为空的都更新成t2表中的age值。
以上这个sql语句是可以更新的,但我有点不明白的是,更新的时候a.age中的一个age怎么知道和b.age中的哪个age对应呢,因为set后面的查询语句不是连表查询,查出来的只是t2表中的一堆age,它怎么知道和t1表中的哪个age对应上呢,虽然有a.name = b.name,但如果不是连表查询的话,查出来的t2表的age应该是乱的吧,怎么和t1表中的age一一匹配呢
我的表达也有点不清晰,希望大家能明白我的意思
以上这个sql语句是可以更新的,但我有点不明白的是,更新的时候a.age中的一个age怎么知道和b.age中的哪个age对应呢,因为set后面的查询语句不是连表查询,查出来的只是t2表中的一堆age,它怎么知道和t1表中的哪个age对应上呢,虽然有a.name = b.name,但如果不是连表查询的话,查出来的t2表的age应该是乱的吧,怎么和t1表中的age一一匹配呢
我的表达也有点不清晰,希望大家能明白我的意思
难怪你理解偏了。
取t1的一条记录,然后利用内部查询a.name=b.name定位,获取对应的b.age值,然后更新。就这样子。
t1
name1 age1
a 1
b nullt2
name2 age2
a 3
b 4update t1 a set a.age1= (select b.age2 from t2 b where a.name1 = b.name2 ) where a.age1 is null;
执行语句的过程如下
1、通过条件where a.age1 is null筛选出name1为b age1为null 这条记录
2、执行括号里的查询select b.age2 from t2 b where a.name1 = b.name2 得到的值为4
3、把name1为b age1为null 这条记录对应的age1字段的值由null改为4
SQL> select * from t1;NAME1 AGE1
-------------------- ----------
a 1
bSQL> select * from t2;NAME2 AGE2
-------------------- ----------
a 3
b 4SQL> update t1 a set a.age1= (select b.age2 from t2 b where a.name1 = b.name2 )
where a.age1 is null;1 row updated.SQL> select * from t1;NAME1 AGE1
-------------------- ----------
a 1
b 4SQL>