【问题标题】:SQL: Recursive querySQL:递归查询
【发布时间】:2012-12-05 17:40:41
【问题描述】:

我一直在试图弄清楚如何确定在名为 Blake 的特定员工之后雇用了多少员工。我想使用递归查询。我尝试了以下查询无济于事:

Select E.Ename, E.Hiredate
From EMPLOYEES E, EMPLOYEES B
Where e.Hiredate = b.Hiredate
and e.Hiredate > b.Hiredate
and b.Ename = 'blake';

我的想法是我通过'e.Hiredate = b.Hiredate'将Employees表加入到自身中,我错过了什么?

【问题讨论】:

  • Where e.Hiredate = b.Hiredate and e.Hiredate > b.Hiredate 这将产生一个空的结果集。
  • 正确。我迷失的地方是如何将所有员工的雇佣率与布雷克进行比较。

标签: sql recursion


【解决方案1】:

如果您没有两者,您的查询会起作用

      e.Hiredate = b.Hiredate
  and e.Hiredate > b.Hiredate

希望大家看看这2个值怎么不能̲*s̲i̲m̲u̲l̲t̲a̲n̲e̲o̲u̲s̲l̲y̲*相等不相等!!

Select E.Ename, E.Hiredate
From EMPLOYEES E, EMPLOYEES B
Where e.Hiredate > b.Hiredate
and b.Ename = 'blake';

当然,由于您问的是一个相当基本的 101 问题,我假设只有一名员工可以被命名为“布莱克”(即 Ename 是唯一标识符),否则还有其他逻辑漏洞可供选择。

由于您是从 SQL 开始,我还建议您使用 ANSI 联接而不是表列表(逗号)形式,如下所示:

Select E.Ename, E.Hiredate
  From EMPLOYEES E
  JOIN EMPLOYEES B on e.Hiredate > b.Hiredate
 WHERE b.Ename = 'blake';

【讨论】:

    【解决方案2】:

    又快又脏:

    SELECT Ename, Hiredate
    FROM employees
    WHERE hiredate > (SELECT TOP 1 hiredate FROM employees WHERE ename = 'blake')
    

    【讨论】:

      【解决方案3】:
      select e.*
      from employees e
      where hiredate > (select max(hiredate)
                        from employees
                        where ename = 'blake');
      

      内部查询中的max() 是必要的,以确保只返回一行,即使有更多同名的员工

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 2020-11-27
        • 2015-07-13
        • 2014-12-19
        • 2012-12-05
        • 2016-01-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        相关资源
        最近更新 更多