2017-01-10 4 views
0

У меня есть таблица, как следует.Предложение DELETE в заявлении MERGE

Name   Null   Type   
----------- --------  -------------- 
EMPLOYEEID **NOT NULL** NUMBER   
NAME   **NOT NULL** VARCHAR2(1000) 
AGE   *NOT NULL* NUMBER   
SALARY     NUMBER   
DELETEDFLAG    NUMBER(1) 

Я написал инструкцию MERGE для вставки, обновления и удаления записей, как показано ниже.

MERGE INTO EMPLOYEE tgt USING (
SELECT(SELECT EMPLOYEE.rowId as rid from EMPLOYEE WHERE employeeid = 70) as rid from dual) src ON (tgt.rowid = src.rid) 
WHEN MATCHED THEN UPDATE SET name = 'PSS', age = 25, salary = 2589 
WHERE employeeid = 70 
DELETE WHERE DELETEDFLAG = 1 
WHEN NOT MATCHED THEN 
INSERT (employeeId, name, age, salary, deletedFlag) VALUES(70, 'TSS', 28, 15000, 0); 

У меня возникла проблема при удалении записи. Я хочу удалить записи, когда получаю нулевые значения для имени, имени и зарплаты, а deleteFlag равен нулю. Я знаю только employeeID. Запрос MERGE, как показано ниже.

MERGE INTO EMPLOYEE tgt USING (
SELECT(SELECT EMPLOYEE.rowId as rid from EMPLOYEE WHERE employeeid = 70) as rid from dual) src ON (tgt.rowid = src.rid) 
WHEN MATCHED THEN UPDATE SET name = null, age = null, salary = null 
WHERE employeeid = 70 
DELETE WHERE DELETEDFLAG = 0 
WHEN NOT MATCHED THEN 
INSERT (employeeId, name, age, salary, deletedFlag) VALUES(70, null, null, null, 0); 

Проблема, с которой я столкнулся, заключается в том, что она пытается обновить записи. Имя не имеет нулевого столбца, но оно пытается обновить с помощью null. Так получилось SQL-ошибка.

не может обновить (% S) в NULL

Если я прохожу не нулевое значение, которое он работает, как ожидалось.

Может кто-нибудь, пожалуйста, сообщите, как я могу справиться с этим сценарием?

ответ

0

Изменение predicats в разделах обновления этой

WHERE employeeid = 70 and DELETEDFLAG <> 0 

Если DELETEDFLAG может быть нулевым, я предполагаю, что вы знаете, как изменить предикат