为什么此代码不更新?
UPDATE hr.employees SET salary = 1000
WHERE employee_id NOT IN (SELECT distinct manager_id from hr.employees);
commit;
我认为问题出在“NOT IN”上。
最佳答案
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
时,这种行为会更直观。
关于sql - 此更新有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27089991/