Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用SQL中的语句转换/修复此问题?_Mysql_Sql_Database_Relational Database - Fatal编程技术网

Mysql 如何使用SQL中的语句转换/修复此问题?

Mysql 如何使用SQL中的语句转换/修复此问题?,mysql,sql,database,relational-database,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 SELEC

我有这个查询,但显然,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 syntax是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;

这种方法当然更易于阅读和调试,编写更简单的代码也有一些好处,可以让更多的开发人员维护它,而无需在堆栈溢出上发布帮助。

重写此查询的另一种方法:

SELECT branch_name
  FROM account
 GROUP BY branch_name
HAVING SUM(balance) < (SELECT AVG(value) 
                         FROM (SELECT branch_name, SUM(balance) AS value
                                 FROM account
                                GROUP BY branch_name) t1)
从这段代码中可以看到,account表对它运行了两次几乎相同的聚合查询,一次是在外层,另一次是嵌套在两个深层


WITH子句的好处是,您可以编写一次聚合查询,给它一个名称,并根据需要多次使用它。此外,智能数据库引擎将只运行该子功能查询一次,但根据需要经常使用结果。

是。这可以不做。有很多这样的例子。如果你不能将CTE与一起使用,那么就使用子查询:这个查询毫无意义。如果你使用了正确的语法,也许会有用。您还应该描述查询正在做什么,并提供示例数据和所需结果。@GordonLinoff它在MYSQL 8上提供结果,但在较低的MYSQL上。。。它抱怨道。@Nicoleforster。不是问题中写的那样。有多个语法错误。感谢您的回复。当我尝试运行它时,我得到了一个错误:branch_total不存在,而语法提供了一个好处。如果没有WITH子句,则branch_total子分解查询需要排两行才能得到所需的结果。是的,没错。我没有注意到它在这么做。我已经编辑了上面的答案,你可以看到我在计算算术平均值之前,必须先计算算术平均值。这就是我没有测试的结果!谢谢,它很有效。我刚刚习惯了复杂的查询。所以我同时在做研究和实验。我真的很感激。我得到了这个错误:每个派生表都必须有自己的别名和您的解决方案。我在不等式运算符右侧为派生表子选择添加了一个别名t1,它应该可以解决您遇到的错误。
SELECT branch_name
  FROM account
 GROUP BY branch_name
HAVING SUM(balance) < (SELECT AVG(value) 
                         FROM (SELECT branch_name, SUM(balance) AS value
                                 FROM account
                                GROUP BY branch_name) t1)