有两个一样的表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为空的,直接修改即可)希望四海八荒的各位上神给支支招,先谢过诸位上神。
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为空的,直接修改即可)希望四海八荒的各位上神给支支招,先谢过诸位上神。
(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
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
这位上神,感谢您百忙之中给我的回复,可不可以不用merge来实现呢,我用得是Access数据库。
这位上神,感谢您百忙之中给我的回复,可不可以不用merge来实现呢,我用得是Access数据库。access比较古老,不会的话你就多写几条SQL执行把。
这位上神,感谢您百忙之中给我的回复,可不可以不用merge来实现呢,我用得是Access数据库。access比较古老,不会的话你就多写几条SQL执行把。这样,我都导入到Oracle了,执行语句的时候出现以下错误:[Err] ORA-00904: "T2"."BYNAME": 标识符无效还请上神指点指点。
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;