这个更新有什么问题?

时间:2014-11-23 14:26:23

标签: sql oracle sql-update

为什么此代码无法更新?

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

我认为问题是关于NOT IN。

1 个答案:

答案 0 :(得分: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时,这会以更直观的方式表现。