2014-04-14 131 views
0

有人可以帮助我吗?我试图转换下面合并到另一个查询,我只允许插入使用和更新一次:如何更改此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); 

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

感谢提前:)

+0

...为什么你有这个要求?为什么不允许“MERGE”?你已经拥有'UPDATE'和'INSERT'语句的基础,本质上 - 你卡住了什么?请注意,您必须按照该顺序执行操作 - 更新现有行然后插入新行(尽管不像某些情况那样危险)。你为什么不减少员工的薪水? –

+0

这是大学的一项要求,所以必须有一些方法可以在不使用合并的情况下实际转换查询。或者你不觉得有另一种方式?如果员工已经存在,并且如果不存在复制整个条目的任务,则选择较高的薪水 - 该任务由我的大学分配。 – smat88dd

回答

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能力导入。

+0

谢谢!嵌套查询 - 学到了新东西。 – smat88dd

0

尝试后,我注意到,INSERT代码实际上应该是这样的:
1)不要使用名称我两次
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 
);