如果记录不存在,插入新记录,如果记录存在,则重复记录

问题描述:

如果我的客户没有表A中的现有记录,我想在表A中插入新记录。如果我的客户已经有A表中的现有记录,我想复制它并创建一个新记录。如果记录不存在,插入新记录,如果记录存在,则重复记录

我想使用MERGE,但发现它应该是UPDATE和INSERT,而不是INSERT和INSERT。

请指教。

表A

ID   CUSTOMER_ID   DATA 
1    104     Data1 
2    104     Data2 

在上面的表中,说我已经CUSTOMER_ID = 105。因为它不是在表中,我将插入一个新纪录的customer_id = 105:

3    105     Data3 

如果我已经CUSTOMER_ID = 104,我将重复记录的最大的客户,因为它存在于表:

4    104     Data2 
+0

如果你只是想每次插入,为什么不总是做一个简单的插入? – Greg

+0

听起来不管怎样,你只是插入一个新的记录。你能分享一些样本数据和你试图让这个问题更清楚一些的结果吗? – Mureinik

+0

我更新了描述,我的道歉原因我现在想不到一个解决方案 – iPhoneJavaDev

假设您不想完全复制记录并在插入重复记录时更改某些列的值,我尝试创建以下过程。我用雇员表作为例子。如果这适用于您,则将该员工更换为客户。

CREATE OR REPLACE PROCEDURE prc_insert_emp (p_empno IN NUMBER) 
AS 
    v_exists NUMBER; 
BEGIN 
    SELECT 1 INTO v_exists 
    FROM emp 
    WHERE empno = p_empno; 

    --Duplicate the record when employee is found 
    INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) 
    SELECT 1111, ename, job, mgr, hiredate, sal, comm, deptno 
    FROM emp 
    WHERE empno = p_empno; 

    DBMS_OUTPUT.PUT_LINE('Employee found'); 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    --Insert values when the record is not found 
     INSERT INTO EMP (empno, ename, job, mgr, hiredate, sal, comm, deptno) 
     VALUES (5599, 'KING', 'MANAGER', 7839, SYSDATE, 5000, 50, 10); 
     DBMS_OUTPUT.PUT_LINE('Employee not found'); 
END; 

您可以调用此过程并传递相关参数(可能是您的客户ID)。此外,您可以添加一个out参数,该参数将返回一个标志来表示客户是否重复或新插入。

如果你想在一个语句中做到这一点,试试这个。

INSERT INTO CUST 
SELECT MAX(id)+1, 
     customer_id, 
     'DATA2' FROM CUST 
WHERE customer_id = 104 
GROUP BY customer_id 
UNION ALL 
SELECT 5, 
     104, 
     'DATA2' FROM DUAL 
WHERE NOT EXISTS (SELECT 1 FROM cust WHERE customer_id = 104); 

在上面的语句中,如果找到了客户104,那么上面的union all查询将被执行(它将复制客户id 104的记录)。由于NOT EXISTS条件,UNION ALL下面的查询将不会被执行。

如果未找到客户,则上面的查询UNION ALL将不返回任何行。但是,UNION ALL下方的查询将被执行,您可以使用新的客户ID插入新记录。

+0

有没有像MERGE这种快捷方法这种情况下,或者我真的需要在程序中做到这一点? – iPhoneJavaDev

+0

编辑我的答案并添加了第二个解决方案。 –