繁体   English   中英

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

[英]How can I convert/fix this WITH statement in SQL?

我有这个查询,但是显然, 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上发布帮助。

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

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)

从该代码中可以看到,帐户表对它运行了几乎相同的聚合查询两次,一次是在外部级别,另一次是嵌套在两个级别。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM