2014-11-23 52 views
2

爲什麼這段代碼不更新?這個UPDATE有什麼問題?

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

我認爲問題是關於不在。

+0

用'oracle'重新標記,因爲這裏沒有涉及PL/SQL。 – 2014-11-23 14:28:00

+1

'manager_id'可以包含空值嗎?順便說一句:'distinct'在子查詢中是無用的 – 2014-11-23 14:28:20

回答

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