sql - 此更新有什么问题?

标签 sql oracle sql-update

为什么此代码不更新?

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 值时,表达式始终为所有行返回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 时,这种行为会更直观。

关于sql - 此更新有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27089991/

相关文章:

MySQL引用子查询的结果

sql - Postgres upsert 不增加序列号?

sql - 在WHERE子句中使用随机函数

sql - 作为 UDF 结果的列上的 Where 子句

java - NamedJdbcTemplate 更新问题

java - 无法在 Java 中从 Linux 计算机连接到 Oracle 数据库

Oracle 和 JDBC 性能 : INSERT ALL vs preparedStatement. addBatch

mysql - 如何只更新 mysql 中文本条目的一部分?

sql - 将 SQLite DB 文件转换为 "LINQ to SQL",如 SQLMetal.exe

sql - 在符合条件的表中查找最右边的列