Как я могу преобразовать / исправить этот оператор WITH в SQL? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть этот запрос, но, по-видимому, оператор 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?Пожалуйста помоги.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Другой способ переписать этот запрос:

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)

Как видно из этого кода, таблица счетов имеет почти один и тот же агрегированный запрос, выполненный дважды, один раз на внешнем уровне и снова вложенный в два уровня.deep.

Преимущество предложения WITH заключается в том, что вы можете написать этот агрегированный запрос, присвоив ему имя, и использовать его столько раз, сколько необходимо.Кроме того, интеллектуальный механизм БД будет выполнять этот подфакторный запрос только один раз, но использовать результаты так часто, как это необходимо.

0 голосов
/ 01 марта 2019
Синтаксис

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

...