2014-11-23 25 views
2

为什么这段代码不更新?这个UPDATE有什么问题?

UPDATE hr.employees SET salary = 1000 
    WHERE employee_id NOT IN (SELECT distinct manager_id from hr.employees); 
    commit; 

我认为问题是关于不在。

+0

用'oracle'重新标记,因为这里没有涉及PL/SQL。 – 2014-11-23 14:28:00

+1

'manager_id'可以包含空值吗?顺便说一句:'distinct'在子查询中是无用的 – 2014-11-23 14:28:20

回答

3

NOT IN具有独特的语义。当manager_id的值为NULL时,表达式始终为所有行返回NULLFALSE。也就是说,它会过滤掉所有的行。

您可以直接做解决这个问题:

UPDATE hr.employees 
    SET salary = 1000 
    WHERE employee_id NOT IN (SELECT manager_id from hr.employees WHERE manager_id is not null); 

(是不需要的distinct要么)

在我看来,更好的方法是使用NOT EXISTS而非NOT IN当你有一个子查询。

UPDATE hr.employees 
    SET salary = 1000 
    WHERE NOT EXISTS (SELECT 1 from hr.employees e WHERE e.manager_id = employees.employee_id); 

这表现在更直观的方式,当manager_id可能是NULL