2014-04-14 130 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 
);