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一一匹配呢
我的表达也有点不清晰,希望大家能明白我的意思

解决方案 »

  1.   

    谁说不是连表查询?这种内部表表达方式就是连表查询的一个变种啊。
    难怪你理解偏了。
    取t1的一条记录,然后利用内部查询a.name=b.name定位,获取对应的b.age值,然后更新。就这样子。
      

  2.   

    举个例子说吧 这样可能会更形象些
    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>