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