update sp_family set (户主姓名)= (select a.pname from sp_person a ,sp_family b where trim(a.fcode)=trim(b.fcode));错误提示是:ORA-01427: 单行子查询返回多个行
这条语句该怎样写呢,sp_person和sp_family都有数据,两个表有个关联的字段fcode,然后把sp_family表中pname里的数据插到sp_person中的 户主姓名 字段中。

解决方案 »

  1.   

    (select a.pname from sp_person a ,sp_family b where trim(a.fcode)=trim(b.fcode))
    返回了多个值
      

  2.   

    UPDATE sp_family a
       SET a.户主姓名 = (SELECT b.pname FROM sp_person b WHERE TRIM(a.fcode) = TRIM(b.fcode))
      

  3.   

    恩,实际上时因为你后边那条语句有重复名字的多条记录,所以UPDATE无法执行,他不知道执行更新用到哪一条可以多加个where 条件去掉那些count总数大于2的,你自己写吧,懒得写语句
      

  4.   

    或者 你在里边的where 加个 rownum<2
    不过这样会把同名的默认取第一个更新,不是很严谨
      

  5.   

    UPDATE sp_family a
       SET a.户主姓名 = (SELECT b.pname FROM sp_person b WHERE TRIM(a.fcode) = TRIM(b.fcode))
    where exists (SELECT 1 FROM sp_person b WHERE TRIM(a.fcode) = TRIM(b.fcode))
      

  6.   

    UPDATE sp_family a
       SET a.户主姓名 = (SELECT b.pname FROM sp_person b WHERE TRIM(a.fcode) = TRIM(b.fcode))
      

  7.   

    这个family下有多个person,那得再有条件定位到具体哪个person就是户主。
    如果无所谓,只要插个进去,那就加个 rownum = 1
      

  8.   

    都给楼主说那么明白了,还要人写
    具体点吧(oracle):
    第一步 查出同名的person表的所有名字
    SELECT b.pname FROM sp_person b,sp_famliy a where a.fcode=b.fcode and b.主键!=b.主键第二步 更新所有无同名的数据UPDATE sp_family a
      SET a.户主姓名 = (SELECT b.pname FROM sp_person b WHERE TRIM(a.fcode) = TRIM(b.fcode))
    where  exists (SELECT 1 FROM sp_person b WHERE TRIM(a.fcode) = TRIM(b.fcode) 
    and b.pname not in(第一步粘贴到这里)
    )没有做数据测试,可能具体语句有小错,而且我也不会优化过的,你自己看着修修吧
      

  9.   

    优化后的语句:
    UPDATE sp_family a
      SET a.户主姓名 = (SELECT b.pname FROM sp_person b WHERE TRIM(a.fcode) = TRIM(b.fcode)
    and b.pname not in
    (
    select pname from (
    select count(*) n ,pname from sp_person group by pname having count(*)>1));
    我技术水平就这么点了,反正能实现功能,高手估计都没看到你这个题
      

  10.   

    另外同名的你要另外处理 
    select pname from (
    select count(*) n ,pname from sp_person group by pname having count(*)>1)这几个人名有重名,你自己看着弄吧