经过上一贴,我明白了怎么在oracle多表条件update
比如把t-sql的:update btc_checkdata set dzfs=b.dzfs,dzfsto=b.dzfsto 
from dz_ClientInfo b 
where btc_checkdata.sclientid=b.sclientid and 
      btc_checkdata.sL2OrgID=b.sL2OrgID and 
      btc_checkdata.dcheckdate=sysdate;写成pl/sql的:update btc_checkdata c set 
         icheckmode=(select t.icheckmode from btc_clientinfo t where c.icheckmode=t.icheckmode),
         scheckmodeto=(select t.scheckmodeto from btc_clientinfo t where c.scheckmodeto=t.scheckmodeto)
  where sclientid=(select t.sclientid from btc_clientinfo t where c.sclientid=t.sclientid) and 
        sL2OrgID =(select t.sL2OrgID from btc_clientinfo t where c.sL2OrgID=t.sL2OrgID)  and 
        dcheckdate=sysdate;理论上这是没错的吧,我也用测试表试过了,那时候很开心~~
结果今天突然遇上问题了
btc_clientinfo表客户信息表
btc_checkdata表是账单信息表
是一对多的关系
其实就算1对1关系
像里面的select t.sclientid from btc_clientinfo t where c.sclientid=t.sclientid 
等就会查出不止一条的记录,所以报错ORA-01427: single-row subquery returns more than one row
我试了下把=改成in是能运行了但是和把那句注释掉的结果一样,应该不对吧
怎么t-sql里面就没有那么麻烦的情况呢。
我不知道怎么写了如果限制了子查询返回的结果那是不是又改变了原句的意思了?因为返回的结果是多条不一样的记录啊我好烦恼喔,哪位大侠可以帮帮我吗~~~~~~~非常感谢

解决方案 »

  1.   

    如果多条记录的value都是一样的值就用max()或min()取一个值就好了。否则列值只能“一对一”进行更新。
      

  2.   

    加个distinct
    select distinct t.sclientid from btc_clientinfo t where c.sclientid=t.sclientid  
      

  3.   

    改成下面的sql:UPDATE BTC_CHECKDATA C
       SET (ICHECKMODE, SCHECKMODETO) = (SELECT T.ICHECKMODE, T.SCHECKMODETO
                                           FROM BTC_CLIENTINFO T
                                          WHERE C.ICHECKMODE = T.ICHECKMODE
                                            AND C.SCHECKMODETO = T.SCHECKMODETO
                                            AND C.SL2ORGID = T.SL2ORGID
                                            AND ROWNUM = 1)
     WHERE EXISTS (SELECT T.SCLIENTID
              FROM BTC_CLIENTINFO T
             WHERE C.ICHECKMODE = T.ICHECKMODE
               AND C.SCLIENTID = T.SCLIENTID
               AND C.SL2ORGID = T.SL2ORGID)
       AND DCHECKDATE = SYSDATE;
      

  4.   

    哥哥,这个不能在oracle 里用吧0  0
      

  5.   

    就是不一样的记录啊~~~
    为什么t-sql里就那么简单啊1对1?要循环要游标啥的吧?
      

  6.   

    其实,我有点不是很明白,像update btc_checkdata set dzfs=b.dzfs,dzfsto=b.dzfsto 
    from dz_ClientInfo b 
    where btc_checkdata.sclientid=b.sclientid and 
          btc_checkdata.sL2OrgID=b.sL2OrgID and 
          btc_checkdata.dcheckdate=sysdate;我像问个很菜的问题
    这样的联表更新句子,他的原意是如果where条件成立就更新btc_checkdata 里所有set列出的字段
    还是只更新符合where条件里成立的记录字段?应该是后者吧?
    (突然不让我发帖了,说我灌水,没搞错吧?)