首页 > 解决方案 > 如何在没有联合的情况下使用sql递归?

问题描述

我有一个关于 sql 递归理论的问题。定义:如果一个公用表表达式在其定义中使用了自己,这称为递归。 FedEmp(name, salary, manager)

查找 Hoover 管理下的所有工资超过 100000 的员工

with agents(name, salary) as
    ((select name, salary                   --initial query
      from FedEmp 
      where manager = ‘Hoover’)
    union all
     (select f.name, f.salary               --recursive query
      from agents as a, FedEmp As f
      where f.manager = a.name))
select name from agents;                    --final query

标签: sqltsqlcommon-table-expressionrecursive-query

解决方案


要进行递归 UNION ALL没有其他方法,这是定义

简要说明其背后的机制:

  • 之前的第一部分UNION ALL用于“获取一组初始行”。

  • 之后的第二部分UNION ALL用于“根据上一次迭代中找到的内容添加更多行”。

第二部分继续执行,直到找不到要添加的新行(或直到达到 MAXRECURSION 限制;这是可配置的)。

另外,请参阅这个相关问题:为什么 Transact-SQL 中的递归 CTE 需要 UNION ALL 而不是 UNION?

要回答关于查找所有薪水超过 100000 的员工的第二部分,我认为WHERE salary > 100000在最后添加就可以了。CTE 以递归方式查找人员,尚未查看薪水;然后你按薪水过滤它们。


推荐阅读