Синтаксис
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 для получения помощи.