2017-01-10 83 views
0

我有一个表如下。MERGE语句中的DELETE子句

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); 

我在DELETING记录时遇到问题。当我收到名称,姓名和薪水的空值并且deleteFlag为零时,我想删除这些记录。我只知道雇员ID。 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可以为空我假设你知道如何改变谓词