mysql - 如何在 SQL 中转换/修复此 WITH 语句?

标签 mysql sql database relational-database

我有这个查询,但显然 WITH 语句尚未在某些数据库系统中实现。我如何重写此查询以获得相同的结果。

基本上,此查询应该做的是提供数据库中存款总额小于所有分支加起来的平均值的所有分支的分支名称。

WITH branch_total (branch_name, value) AS 
SELECT branch_name, sum (balance) FROM account
GROUP BY branch_name
WITH branch_total_avg (value) AS SELECT avg(value)
FROM branch_total SELECT branch_name
FROM branch_total, branch_total_avg
WHERE branch_total.value < branch_total_avg.value;

没有 WITH 可以用其他方式写吗?请帮忙。

最佳答案

WITH 语法作为 MySQL 8.0 的新特性引入。您已经注意到它在早期版本的 MySQL 中不受支持。如果不能升级到 MySQL 8.0,则必须使用如下子查询重写查询:

SELECT branch_total.branch_name
FROM (
  SELECT branch_name, SUM(balance) AS value FROM account
  GROUP BY branch_name
) AS branch_total
CROSS JOIN (
  SELECT AVG(value) AS value FROM (
    SELECT SUM(balance) AS value FROM account GROUP BY branch_name 
  ) AS sums
) AS branch_total_avg
WHERE branch_total.value < branch_total_avg.value;

在这种情况下,WITH 语法没有任何优势,所以您不妨这样写。

另一种可能更有效的方法是将其拆分为两个查询,因为它可以避免在查询中使用临时表:

  SELECT AVG(value) INTO @avg FROM (
    SELECT SUM(balance) AS value FROM account GROUP BY branch_name
  ) AS sums;

  SELECT branch_name, SUM(balance) AS value FROM account
  GROUP BY branch_name
  HAVING value < @avg;

这种方法当然更易于阅读和调试,并且编写更直接的代码有一些优势,可以让更多开发人员维护它而无需在 Stack Overflow 上发帖寻求帮助。

关于mysql - 如何在 SQL 中转换/修复此 WITH 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54936003/

相关文章:

PHP、Mysql 从 strtotime 按月获取存档

php - 我如何从 mysql 查询创建这个数组?

mysql - "Failed TCP accept: emfile"在 Ejabberd

php - 逐个键查找两行数据之间的差异

mysql - 使用 Union 替代方案按日期从两个表中排序

java - 回家时 Activity 崩溃

mysql - 如何编辑DB文件并在其表之一中插入多条记录?

SQL - 多行到单列

MySQL更新查询在同一个表上使用聚合子查询

java - 使用Java可搜索的行级加密?