为什么此代码无法更新?
UPDATE hr.employees SET salary = 1000
WHERE employee_id NOT IN (SELECT distinct manager_id from hr.employees);
commit;
我认为问题是关于NOT IN。
答案 0 :(得分:3)
NOT IN
具有特殊的语义。当manager_id
采用NULL
值时,表达式始终会为所有行返回NULL
或FALSE
。也就是说,它会过滤掉所有行。
您可以通过执行以下操作直接解决此问题:
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
时,这会以更直观的方式表现。