如何更改此db2合并查询?

时间:2014-04-14 02:23:38

标签: sql db2

有人能帮帮我吗?我试图将以下合并转换为另一个查询,我只允许使用插入和更新一次:

MERGE INTO MYEMPLOYEE ME USING EMPLOYEE E ON ME.EMPNO = E.EMPNO 
WHEN MATCHED THEN 
UPDATE SET ME.SALARY = CASE WHEN ME.SALARY > E.SALARY THEN ME.SALARY ELSE E.SALARY END 
WHEN NOT MATCHED THEN 
INSERT VALUES(E.EMPNO, E.FIRSTNME, E.MIDINIT, E.LASTNAME, E.WORKDEPT, E.PHONENO, E.HIREDATE, E.JOB, E.EDLEVEL, E.SEX, E.BIRTHDATE, E.SALARY, E.BONUS, E.COMM);

我怎样才能做到这一点?如果不存在,则上述合并将复制数据,如果存在,则检查工资并选择较高的工资并复制该工资。 如何通过仅使用一个插入和一个更新来实现相同的目标?有人可以给我提示吗?

提前致谢:)

2 个答案:

答案 0 :(得分:1)

MERGE命令的目的是考虑UPDATEINSERTDELETE的多个操作。 MERGE statement explained

如果您不能/无法使用MERGE,则必须单独执行每个请求。

UPDATE MYEMPLOYEE ME
  SET ME.SALARY = (
    SELECT CASE WHEN ME.SALARY > E.SALARY THEN ME.SALARY ELSE E.SALARY END 
    FROM EMPLOYEE E 
    WHERE ME.EMPNO = E.EMPNO
 )
 WHERE EXISTS(
   SELECT 1 
   FROM EMPLOYEE E 
   WHERE ME.EMPNO = E.EMPNO
 );

然后执行主表中员工不存在的插入。

INSERT INTO MYEMPLOYEE ME
  SELECT * 
  FROM EMPLOYEE E 
    LEFT OUTER JOIN MYEMPLOEE ME ON E.EMPNO=ME.EMPNO
  WHERE ME.EMPNO IS NULL;

如果您需要完全扫描,可以使用IMPORT命令。但是你正在处理文件。您需要导出EMPLOYEE表(可能已经格式化了薪水),然后使用INSERT_REPLACE能力导入。

答案 1 :(得分:0)

尝试后我发现INSERT代码应该是这样的:
1)不要两次使用名称ME 2)选择必要的列,因为在连接后有两倍的列数

INSERT INTO MYEMPLOYEE (
    SELECT E.EMPNO, E.FIRSTNME, E.MIDINIT, E.LASTNAME, E.WORKDEPT, E.PHONENO, E.HIREDATE, E.JOB, E.EDLEVEL, E.SEX, E.BIRTHDATE, E.SALARY, E.BONUS, E.COMM 
    FROM EMPLOYEE E LEFT OUTER JOIN MYEMPLOYEE ME ON E.EMPNO = ME.EMPNO WHERE ME.EMPNO IS NULL
);