【问题标题】:What is wrong with this UPDATE?这个更新有什么问题?
【发布时间】:2014-11-23 14:26:23
【问题描述】:

为什么这段代码没有更新?

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

我认为问题在于 NOT IN。

【问题讨论】:

  • 重新标记为oracle,因为这里不涉及 PL/SQL。
  • manager_id 可以包含空值吗?顺便说一句:distinct 在子查询中没有用

标签: sql oracle sql-update


【解决方案1】:

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 时,这会以更直观的方式运行。

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 2012-05-26
    • 2021-08-20
    • 2015-09-23
    • 2021-02-27
    • 2012-03-10
    • 2010-11-01
    • 2011-08-26
    • 2020-04-16
    相关资源
    最近更新 更多