将 SQL 查询从 with 子句转移到没有 with 子句

Transferring SQL query from with clause to without with clause

考虑查询:

找出工资总额大于所有部门工资总额平均值的所有部门

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 构造重写此查询。

查询基于 Korth 的 The database system concept 提供的 University 模式。我假设我只需要考虑讲师 table 来找到查询的答案。

指导老师(ID、姓名、dept_name、工资)

我可以求出所有部门工资总额的平均值

SELECT AVG(salary) GROUP BY dept_name;

然后我输了。我没有找到继续的方法。

我找到了 that。但我正在寻找更多解释,因为我无法从这个 link.

中理解它

感谢您的帮助。

看了你上一题,发现你用的是mysql5.8,那么你可以使用分析功能

select distinct t1.dept_name
  from (
select t1.*,
       sum(salary) over(partition by dept_name) val,
       sum(salary) over() / count(distinct dept_name) over() avg
  from Instructor t1
) t1
 where t1.val > t1.avg

在不支持 CTE 的 mySQL 版本中,有几种方法可以做到这一点(我假设这就是他们让您重写查询以省略 with 的原因)。此外,您正在按部门计算平均工资,但问题是要求找到每个部门的平均总工资,然后 return 低于该值的那些。

https://dbfiddle.uk/?rdbms=mysql_5.5&fiddle=fefea829cff3e20aea93634f9a4114d6

使用子查询:

SELECT dept_name
FROM (
  SELECT dept_name, sum(salary) as salaries
  FROM instructor GROUP BY dept_name
) d

WHERE salaries > (
  SELECT avg(salaries) as avgSalaries FROM (
    SELECT dept_name, sum(salary) as salaries
    FROM instructor GROUP BY dept_name
  ) z
)

加入:

SELECT dept_name
FROM (
  SELECT dept_name, sum(salary) as salaries
  FROM instructor GROUP BY dept_name
) d
CROSS JOIN (
  SELECT avg(salaries) as avgSalaries FROM (
    SELECT dept_name, sum(salary) as salaries
    FROM instructor GROUP BY dept_name
  ) z
) avgs
WHERE salaries > avgs.avgSalaries

使用会话变量(在更高版本中已弃用,但仍然有效):

SELECT avg(salaries) INTO @avg FROM (
  SELECT dept_name, sum(salary) as salaries
  FROM instructor GROUP BY dept_name
) z;

SELECT @avg;

SELECT dept_name
FROM instructor GROUP BY dept_name
HAVING sum(salary) > @avg;

所有好的技术都要了解。