【问题标题】:How to list the employees who are senior to most recently hired employee working under a particular manager in the below schema?如何在以下架构中列出在特定经理下工作的最近聘用员工的高级员工?
【发布时间】:2016-09-16 10:20:17
【问题描述】:

我有一个定义为 emp (empno,ename,job,mgr,hiredate) 的 emp 表架构,我必须评估问题陈述的查询:

列出在国王手下工作的最近聘用员工的高级员工。

我将查询写为:

select hiredate from emp where hiredate < ANY 
( select e.hiredate from emp e where e.mgr= (select e.empno from emp e 
where e.ename='KING') order by hiredate desc )   

此查询给出语法错误,请帮助我。

【问题讨论】:

  • 为什么在子查询中使用 ORDER BY?不要在查询中多次使用同一个表别名。
  • Order by used 获取最近聘用的经理为国王的员工
  • 标记你正在使用的RDBMS?
  • 但您仍然选择所有行。 ORDER BY 根本没有区别。
  • 我已将查询编辑为:selecthiredate from emp wherehiredate

标签: sql oracle


【解决方案1】:

改用 max 函数-

select hiredate 
from emp 
where hiredate < ( select max(hiredate) 
                   from emp 
                   where mgr= (select e.empno 
                               from emp e 
                                where e.ename='KING')); 

【讨论】:

    【解决方案2】:

    要让最近 7 天内加入 King 的员工,您可以尝试:

    SELECT e.*
    FROM emp e
    WHERE e.mgr = (SELECT empno FROM emp WHERE ename='KING') AND
          e.hiredate > DATEADD(day, -7, GETDATE())
    

    请注意,查找 King 员工编号的子查询不相关。所以这是一种友好的子查询。

    【讨论】:

      【解决方案3】:

      使用最大值来查找最大的雇用日期,并使用联接而不是子查询。

      select * from emp where hiredate < 
        (select max(e.hiredate) 
         from emp e 
         join emp mg on e.mgr = mg.empno
         where mg.ename = 'KING')
      

      我猜你有这个错误信息

      ORDER BY 子句在视图、内联函数、派生中无效 表、子查询和公用表表达式,除非 TOP 或 FOR 还指定了 XML。

      所以你应该添加一个TOP 1 让它工作(但是,这真的更具可读性吗?)

      select hiredate from emp where hiredate < ANY 
      (select TOP 1 e.hiredate from emp e where e.mgr= (select e.empno from emp e 
      where e.ename='KING') order by hiredate desc ) 
      

      【讨论】:

      • 我同意你的解决方案,但是为什么上面的查询不起作用,我使用了 ANY 子句,为什么不起作用>
      • @stackuser 编辑了我的答案。
      【解决方案4】:
      SELECT *
      FROM   emp
      WHERE  hiredate < ANY (SELECT hiredate
                             FROM   emp
                             WHERE  ename = 'MILLER'); 
      

      【讨论】:

      • 您可以使用此代码查找特定人员的 SR 成员。
      • 请使用edit 在您的帖子中添加信息,而不是使用 cmets。还要避免全部大写。它的叫喊
      • 欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案添加解释并说明适用的限制和假设。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 2020-03-12
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多