【问题标题】:How to use sql recursive without union all?如何在没有联合的情况下使用sql递归?
【发布时间】:2020-05-04 03:00:01
【问题描述】:

我有一个关于 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

【问题讨论】:

  • 你的问题是什么?
  • 我想知道,是 sql recursive mush 与 union all 一起使用吗,我不知道这是修复格式还是我不能以其他方式使用它
  • 今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),如果需要更容易转换为外连接
  • 提示 2:UNION ALL 时不要将 SELECT 放在括号内。
  • 但是,我不知道如何使用外连接查找所有工资超过 100000 的员工

标签: sql tsql common-table-expression recursive-query


【解决方案1】:

要递归你需要UNION ALL,没有别的办法,那就是by definition

简要说明其背后的机制:

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

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

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

另外,请参阅此相关问题:Why does a Recursive CTE in Transact-SQL require a UNION ALL and not a UNION?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多