先理顺一下逻辑:三张表,车主cz(czid,dwdz),车辆cl(czid,clph),公安police(clph,dwdz)
cz.czid=cl.czid; cl.clph=police.clph
显然有可能对于一个czid存在多个对应的clph,这样就存在多个police.dwdz,这样的情况该取哪个值来更新cz表中的dwdz呢?
假设从业务逻辑上不可能存在上述情况,也就是说cz.dwdz与police.dwdz至多是1:1关系
那么你可以这样写:UPDATE cz SET cz.dwdz = ( SELECT police.dwdz FROM cl, police WHERE cl.clph = police.clph AND cl.czid = cz.czid ) WHERE cz.dwdz IS NOT NULL如果子查询返回多值那就会发生上面我说的问题了,可能发生返回多值或者返回空
UPDATE cz SET cz.dwdz = ( SELECT police.dwdz FROM cl, police WHERE cl.clph = police.clph AND cl.czid = cz.czid AND rownum < 2 ) WHERE cz.dwdz IS NOT NULL

解决方案 »

  1.   

    但是cl表中,一个czid下有n个clph,且clph不一定全部在police中存在!!这样,即使你更新了,也未必是正确的信息,不知道有什么用处
    请楼主好好考虑一下他的实际意义!
      

  2.   

    谢谢楼上2位,它的意义是这样的.dwdz为空的,我要用police来覆盖,一个czid下可能对应多个clph,因此也对应了多个dwdz,因此我任意取出一个更新即可.
    回kulama2004(kulama) ,你的写法是我最初的时候写的,可是这样,不是一一对应,报的错是返回的结果多于一行,因此是否必须在where后面把更新范围写死?
      

  3.   

    谢谢楼上2位,它的意义是这样的.dwdz为空的,我要用police来覆盖,一个czid下可能对应多个clph,因此也对应了多个dwdz,因此我任意取出一个更新即可.UPDATE cz SET cz.dwdz = ( SELECT police.dwdz FROM cl, police WHERE cl.clph = police.clph AND cl.czid = cz.czid AND rownum < 2 ) WHERE cz.dwdz IS NOT NULL--既然会产生1:N的结果,那只有取舍其中的某个值来插入,这本来就是业务逻辑的事情