2
为什么这段代码不更新?这个UPDATE有什么问题?
UPDATE hr.employees SET salary = 1000
WHERE employee_id NOT IN (SELECT distinct manager_id from hr.employees);
commit;
我认为问题是关于不在。
为什么这段代码不更新?这个UPDATE有什么问题?
UPDATE hr.employees SET salary = 1000
WHERE employee_id NOT IN (SELECT distinct manager_id from hr.employees);
commit;
我认为问题是关于不在。
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
。
用'oracle'重新标记,因为这里没有涉及PL/SQL。 – 2014-11-23 14:28:00
'manager_id'可以包含空值吗?顺便说一句:'distinct'在子查询中是无用的 – 2014-11-23 14:28:20