有两个一样的表T1,T2.,表中含有字段Code、ByName、ObjectName等等其他字段。现在我想对照两个表的ObjectName,把T1中的Code值存入到T2中的ByName。如果T1的ByName有值,而且与T1的code不相同,则新建一条记录。描述不是很清晰,画个图来表示一下吧。T1
Code、ByName、ObjectName  
     aa          0                  橡皮           
     bb          0                  铅笔           
     cc           0                  尺子           T2
Code、ByName、ObjectName  
     AA          Aa                  橡皮         
     BB          Bb                 铅笔         
     CC         0                     尺子        最后我希望得到的 T2 像这样:
Code、ByName、ObjectName  
     AA          Aa                  橡皮         (ByName不为为空)
     AA          aa                  橡皮         (增加一条记录,其他字段值跟上面的记录相同)
     BB          Bb                 铅笔         
     BB          bb                 铅笔         
     CC         cc                   尺子        (ByName为空的,直接修改即可)希望四海八荒的各位上神给支支招,先谢过诸位上神。

解决方案 »

  1.   

    WITH T1 AS
     (SELECT 'aa' CODE, '0' BYNAME, '橡皮' OBJECTNAME
      FROM   DUAL
      UNION ALL
      SELECT 'bb', '0', '铅笔'
      FROM   DUAL
      UNION ALL
      SELECT 'cc', '0', '尺子'
      FROM   DUAL),
    T2 AS
     (SELECT 'AA' CODE, 'Aa' BYNAME, '橡皮' OBJECTNAME
      FROM   DUAL
      UNION ALL
      SELECT 'BB', 'Bb', '铅笔'
      FROM   DUAL
      UNION ALL
      SELECT 'CC', '0', '尺子'
      FROM   DUAL)
    SELECT NVL(A.CODE, C.CODE) AS CODE,
           NVL(NULLIF(A.BYNAME, '0'), B.CODE) AS BYNAME,
           NVL(A.OBJECTNAME, B.OBJECTNAME) AS OBJECTNAME
    FROM   T2 A
    FULL   JOIN T1 B
    ON     A.OBJECTNAME = B.OBJECTNAME
    AND    (A.BYNAME = B.BYNAME OR A.BYNAME = '0')
    LEFT   JOIN T2 C
    ON     C.OBJECTNAME = B.OBJECTNAME
    ORDER  BY CODE, BYNAME
      

  2.   

    MERGE INTO T2 A
    USING (SELECT T1.*, DECODE(T2.BYNAME, '0', 1, 0) AS FLAG, T2.CODE AS NEW_CODE
           FROM   T1
           LEFT   JOIN T2
           ON     T2.OBJECTNAME = T1.OBJECTNAME
           AND    (T1.BYNAME <> T2.BYNAME OR T2.BYNAME = '0')) B
    ON (A.OBJECTNAME = B.OBJECTNAME AND B.FLAG = 1)
    WHEN MATCHED THEN
      UPDATE
      SET    A.BYNAME = B.CODE
    WHEN NOT MATCHED THEN
      INSERT
      VALUES
        (B.NEW_CODE, B.CODE, B.OBJECTNAME)
    更新的SQL
      

  3.   


    这位上神,感谢您百忙之中给我的回复,可不可以不用merge来实现呢,我用得是Access数据库。
      

  4.   


    这位上神,感谢您百忙之中给我的回复,可不可以不用merge来实现呢,我用得是Access数据库。access比较古老,不会的话你就多写几条SQL执行把。
      

  5.   


    这位上神,感谢您百忙之中给我的回复,可不可以不用merge来实现呢,我用得是Access数据库。access比较古老,不会的话你就多写几条SQL执行把。这样,我都导入到Oracle了,执行语句的时候出现以下错误:[Err] ORA-00904: "T2"."BYNAME": 标识符无效还请上神指点指点。
      

  6.   

    看看表结构,t2表有没BYNAME字段,名称有没有拼错
      

  7.   

    BEGIN 
      FOR C_ROW IN(SELECT CODE,BYNAME,OBJECTNAME FROM T1)LOOP
        IF C_ROW.BYNAME<>NULL AND C_ROW.BYNAME<>C_ROW.CODE THEN
          EXECUTE IMMEDIATE 'INSERT INTO T2 VALUES(...)';
        ELSE THEN 
           EXECUTE IMMEDIATE 'UPDATE T2 SET BYNAME='||C_ROW.CODE||'WHERE OBJECTNAME='||C_ROW.OBJECTNAME;
        END IF;
      END LOOP;
    END;