2016-05-16 8 views
0

Я хотел бы вставить новую запись в таблицу A, если в моей таблице нет существующей записи в таблице A. Если в моей таблице уже есть существующая запись в таблице A, я бы хотел ее дублировать и создать новую запись.Вставить новую запись, если запись не существует, дублировать запись, если запись существует

Я думал об использовании MERGE, но выяснил, что это должно быть ОБНОВЛЕНИЕ и ВСТАВИТЬ, а не 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

ответ

1

Предполагая, что вы не хотите полностью дублировать запись и изменять значения некоторых столбцов при вставке дублирующей записи, я попытался создать следующую процедуру. В качестве примера я использовал таблицу сотрудников. Если это сработает для вас, замените сотрудника на клиента.

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; 

Вы можете вызвать эту процедуру и передать соответствующий параметр (который может быть идентификатором клиента в вашем случае). Кроме того, вы можете добавить параметр 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 найден, то запрос выше союза все будет выполнено (это будет дублировать запись для клиента идентификатора 104). Запрос под UNION ALL не будет выполнен из-за состояния NOT EXISTS.

Если клиент не найден, запрос, указанный выше UNION ALL, не будет возвращать никакие строки. Тем не менее, запрос под UNION ALL будет выполнен, и вы можете вставить новую запись с новым идентификатором клиента.

+0

есть ли способ ярлыка, такой как MERGE для этого случая, или мне действительно нужно сделать это в процедуре? – iPhoneJavaDev

+0

Отредактировал мой ответ и добавил второе решение. –

Смежные вопросы