【问题标题】:rewrite sql without with clause不使用 with 子句重写 sql
【发布时间】:2019-04-06 06:09:57
【问题描述】:

我掉进了 SQL 兔子洞,请帮帮我 我需要在没有 with 子句的情况下重写这个查询

with dept_total(dept_name, value) as
     (select dept_name, sum(salary)
     from instructor
     group by dept_name),
dept_total_avg(value) as 
     (select avg(value)
     from dept_total)
select dept_name
from dept_total, dept_total_avg
where dept_total.value >= dept_total_avg.value;

基本上,第一张表将所有基于部门的工资加起来。第二个表得到总和的平均值。我需要找到一种方法来挑选部门总数大于平均值的部门。

只要不使用 with 子句,它可以以任何方式编写。我一直在想—— 选择 sum(salary)/count(salary) 作为 dept_total_avg, dept_name 来自导师 其中 dept_total_avg > all(选择总和(工资), 来自导师) 按部门名称分组;

但它不起作用,现在我的大脑也不起作用。请帮忙。

【问题讨论】:

    标签: mysql sql subquery with-clause


    【解决方案1】:

    您需要计算部门平均值,无需访问中间 cte dept_total

    SELECT
        dept_total.dept_name, dept_total.value, cj.dept_av
    FROM (
        SELECT
            dept_name, SUM(salary) value
        FROM instructor
        GROUP BY
            dept_name
        ) AS dept_total
    CROSS JOIN (
            SELECT
                SUM(salary) / (COUNT(DISTINCT dept_name) * 1.0) dept_av
            FROM instructor
        ) cj
    WHERE dept_total.value >= cj.dept_av
    ;
    

    在原始查询中,有 2 个“公用表表达式”(cte),每个都有一个名称,以便以后可以引用。

    其中第一个被命名为dept_total

    允许任何后续的 cte 以该名称重用该 cte。然而,传统的“派生表”子查询无法实现 cte 的这种重用方面。因此,在最终查询中使用名称 dept_total 时,您必须使用一种新方法来获得部门平均值。


    如果您不知道,MySQL 8 现已推出,它支持“通用表表达式”(with clause

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2021-10-19
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多