今天遇到一个很简单的问题,但是一直没太想明白。
问题:
通过查询B表的结果更新A表对应内容
匹配条件: ID_A = ID_B, TIME_B = 3
更新内容: VALUE_B 赋值给 VALUE_A表A
ID_A | TIME_A | VALUE_A
-----|--------|---------
1    |1       |1
2    |1       |2表B
ID_B | TIME_B | VALUE_B
-----|--------|---------
1    |1       |1
2    |1       |2
1    |2       |3
2    |2       |4
1    |3       |5
2    |3       |6更新结果
ID_A | TIME_A | VALUE_A
-----|--------|---------
1    |1       |5
2    |1       |6注:只利用SQL语句,不用存储过程。
请各位大神指点,并说明原理。多谢~~

解决方案 »

  1.   

    把结果放到临时表,然后更新源表,要写出来吗?如果2005以上可以用CTE来暂存数据。
      

  2.   

    有不用临时表或者暂存数据的方法吗? 就只用update
      

  3.   

    UPDATE A
    SET a.value_a=b.value_b
    FROM a INNER JOIN b ON a.id_a=b.id_b
    WHERE time_b=3
      

  4.   

    update a set value_a=b.value_b
    from b
    where a.id_a=b.id_b and b.time_b=3
    当满足条件a.id_a=b.id_b and b.time_b=3时更新set value_a=b.value_b
      

  5.   

    多谢~ 能帮我看下为什么下边这个语句也能成功吗?
    UPDATE A
    SET A.VALUE_A = (
        SELECT B.VALUE_B
        FROM B
        WHERE A.ID_A = B.ID_B AND B.TIME_B = 3
    )
      

  6.   

    SELECT  B.VALUE_B
    FROM    B
    WHERE   A.ID_A = B.ID_B
            AND B.TIME_B = 3 
    因为你括号里面的这句,刚好只返回了一行,如果是多行,就会报错,所以用我那句会比较稳当,我那句不用考虑是一行还是多行。
      

  7.   

    SELECT  B.VALUE_B
    FROM    B
    WHERE   A.ID_A = B.ID_B
            AND B.TIME_B = 3
    不也是返回多行吗?
      

  8.   

    你要看到红字的地方
    SELECT  B.VALUE_B FROM    B WHERE   A.ID_A = B.ID_B      
       AND B.TIME_B = 3 其实它和a表关联了,这样本来就进一步限定了数据,但是这种写法仅限于特殊数据,如果time_b=3还有多条,那么你那个update是会报错的。不信你可以再加一条数据进去
      

  9.   

    学习  CTE  还不会用  呵呵