删除所有雇用日期大于其经理的雇员

时间:2018-07-05 16:52:49

标签: oracle

我写了

DELETE FROM emp
WHERE
    hiredate < (
        SELECT
            m.hiredate
        FROM
            emp e,
            emp m
        WHERE
            e.mgr = m.empno
    )

但这显示只有3行被删除 注意:我使用了demosql表,该表具有空表,部门,薪水表和奖金表。请帮我解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:1)

您在查询中犯了这些错误:

  • 使用了<而不是>-我给您带来的好处是,它是 错字。
  • 外部查询和子查询之间没有关系,因此即使您修复了上述问题,它仍然会 最后删除所有雇用日期为>全部 经理的聘用日期。

  • 使用旧的隐式联接语法(a,b)代替ANSI标准JOIN语法

您的查询删除所有雇用日期大于其经理的雇员 应该看起来更像

DELETE FROM emp e1 
WHERE  hiredate > (SELECT m.hiredate 
                   FROM   emp e2 
                          JOIN emp m 
                            ON e2.mgr = m.empno 
                               AND e2.empno = e1.empno); 

要验证此方法是否正常运行,请在运行删除操作之前和之后使用此查询。

SELECT
    m.hiredate,
    e.hiredate
FROM
    emp e
    JOIN emp m ON e.mgr = m.empno
WHERE
    e.hiredate > m.hiredate;

要清楚地了解这些功能是如何工作的,请阅读一些有关子查询和联接的信息。