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