合同表ht
合同所在组织id  合同编号   供应商id
fcontrolunitid          fnumber    fpartbid
xxx001                  合同1   yyy101
xxx001                  合同2   yyy102
xxx001                  合同3   yyy103
xxx001                  合同4   yyy201
xxx001                  合同5   yyy202
xxx001                  合同6   yyy203
xxx001                  合同7   yyy301
xxx001                  合同8   yyy302
xxx001                  合同9   yyy303
xxx002                  合同10   yyy101…
xxx003                  合同11   yyy101…
xxx004                  合同12   yyy101…
…  …   …


供应商表gys
供应商所在组织id     供应商id     供应商名称
fadmincuid             fid             fname
xxx001                     yyy101     供应商AA
xxx001                     yyy102     供应商BB
xxx001                     yyy103     供应商CC
xxx002                     yyy201     供应商AA
xxx002                     yyy202     供应商BB
xxx002                     yyy203     供应商CC
xxx003                     yyy301     供应商AA
xxx003                     yyy302     供应商BB
xxx003                     yyy303     供应商CC
…                             …             …

组织表zz
组织id
fid
xxx001
xxx002
xxx003
… 合同表中合同4-合同9的供应商id错误,正确的供应商应该是相同组织id对应的同名的供应商
因为供应商名称相同导致错误,如何通过oracle sql语句update更新为正确的。
表中数据较多,求大神指点,谢谢!

解决方案 »

  1.   

    先做一个子查询,再用merge into 
      

  2.   

    那合同4-合同9的正确的供应商id应该是多少,比如合同4的组织id是xxx001,但是在供应商表中组织id为xxx001的对应了三个供应商id,具体应该是哪个呢?
      

  3.   

    合同4-合同9的正确供应商id应该是
    与合同所在组织相同的组织id下的同名的供应商
    比如:合同4所在组织id是xxx001,对应相同组织id的供应商id有yyy101,yyy102,yyy103等
    其供应商应该是yyy101(名称为供应商AA),而不应该是yyy201(名称也为供应商AA)
    如何写语句呢?
    谢谢。
      

  4.   

    update t_ht h set h.FPARTBID=
    (select fid 
    from t_gys g1
    where h.FCONTROLUNITID=g1.fadmincuid and g1.fname in (select fname from t_gys g2 where g2.FID=h.FPARTBID)
    )
    where substr(fnumber,3)>=4 and substr(fnumber,3)<=9
      

  5.   

    感谢4#ghx287524027,这个更新是合同4-合同9的供应商fpartbid更新为同一个供应商
    但是实际还有很多合同的供应商都是错误的,错误的不止一个供应商
    即子查询返回多个值,如何做呢?
    谢谢啦!!!
      

  6.   

    子查询返回多个值得时候就说明你的供应商表中存在一个 fid 对应多个 供应商名称 或者一个 (fadmincuid, fname)组合对应了多个  fid ,这就得看你的取值策略了            
      

  7.   

    感谢给位,感谢4楼ghx287524027,已用临时办法解决!
    因为合同表中供应商id和供应商表中id是关联字段,现在要update合同表的供应商id,导致update语句报错。
    另外4楼update语句子查询结果返回多指,导致不能直接更新。方法1:
    临时解决方法是把合同表的id也取出来,并把关联查询到的信息create到一个临时表
    然后根据合同表的id和临时表的id关联,然后update合同表的供应商id。
    方法2:
    如果不使用临时表,可用4楼的方法,但要使用游标和循环,语句需要修改一下。
    目前写的语句报错,还没调试好。暂时用方法1解决。