本帖最后由 sunqiusong 于 2010-08-13 16:19:07 编辑

解决方案 »

  1.   

    分多步update,还可以多加条件,先update b.id相同的,在update剩下中与C.id相同的,这样就可以不用遍历b表和c表的空字段了
      

  2.   

    UPDATE FX_ACCOUNTDETAILS A SET A.DETAILID=(
      SELECT NVL(B.ID,NVL(C.ID,A.DETAILID))
      FROM FX_DELIVERYCHECKLIST B,FX_RETURNBOOKCHECKLIST C 
      WHERE A.DETAILID=B.OLDIDENTIFY AND C.OLDIDENTIFY=A.DETAILID)用这样的语句是否会好点?
    有没有高手指点下这两种查询的区别第2部分一样的写法
      

  3.   

    弄好了,谢谢各位。分两个update:
    --与发货明细关联
    UPDATE FX_ACCOUNTDETAILS A SET A.DETAILID=(
           SELECT
                 CASE WHEN B.ID IS NULL THEN A.DETAILID
                      ELSE B.ID
                 END
           FROM
                 FX_DELIVERYCHECKLIST B
           WHERE A.DETAILID=B.OLDIDENTIFY
    ),
    A.INVOICETYPE=(
           SELECT
                 CASE WHEN B.ID IS NULL THEN NULL
                      ELSE 0
                 END
           FROM 
                 FX_DELIVERYCHECKLIST B
           WHERE A.DETAILID=B.OLDIDENTIFY
    );
    COMMIT;
    --与退货明细关联
    UPDATE FX_ACCOUNTDETAILS A SET A.DETAILID=(
           SELECT
                 CASE WHEN B.ID IS NULL THEN A.DETAILID
                      ELSE B.ID
                 END
           FROM
                 FX_RETURNBOOKCHECKLIST B
           WHERE A.DETAILID=B.OLDIDENTIFY
    ),
    A.INVOICETYPE=(
           SELECT
                 CASE WHEN B.ID IS NULL THEN NULL
                      ELSE 1
                 END
           FROM 
                 FX_RETURNBOOKCHECKLIST B
           WHERE A.DETAILID=B.OLDIDENTIFY
    );
    COMMIT;
      

  4.   

    楼主这样语句没有排除b表和C表id可能相同的数据,执行结果是相同ID的都变成c表的id了,和楼主问题里的update语句执行结果是不一样的,当然如果b表和C表id没有重复的就没问题了
      

  5.   

    不会出现你说的情况,B,C两个是从一个表里导过来的。不会出现在ID冲突问题