MySQL 8.0: CTE WITH не выполняет два подпункта - PullRequest
0 голосов
/ 14 апреля 2019

Percona MySQL 8.0.15-5

Привет всем, не могли бы вы помочь мне с проблемой?

Я хочу переписать запрос, используя временную таблицу дляCTE с использованием «с».Этот запрос должен выполнять блокировку данных из одной таблицы в другую.

Рабочий процесс следующий: мы выбираем пакет данных, вставляем его в таблицу назначения, затем выбираем максимальный идентификатор из этого пакета, сохраняем егои при дальнейшем вызове процедуры выбор данных начинается с этого идентификатора.

'with' хорошо подходит в этом случае, чтобы не создавать временную таблицу.Я написал следующий запрос:

  insert ignore quotes
  (
    time,
    symbol,
    server,
    bid,
    ask,
    last,
    volume
  )
  WITH temp AS 
  (
    SELECT
      q.id,
      q.`time`,
      q.symbol,
      q.server,
      q.bid,
      q.ask,
      q.last,
      q.volume,
      q.created_at
    FROM
      `old.quotes2` q
    WHERE
      q.id > id
    ORDER BY
      q.id asc
    LIMIT
      write_limit
  ), m AS (SELECT @max := MAX(t.id) max FROM temp t) -- m subclause not executed
  SELECT
    t.time,
    `search_or_add_of_symbol_id_from_name`(t.symbol) symbol,
    `search_of_server_id_from_name`(lower(t.server)) server,
    t.bid,
    t.ask,
    t.last,
    t.volume
  FROM temp t

MySQL не выполняет второй запрос, называемый m, вероятно, из-за того, что я не буду использовать его в будущем.Чтобы решить эту проблему, я должен добавить дополнительное условие 'join' к основному 'select'.

Можно ли заставить MySQL выполнить подпункт 'm'?Может быть, есть какая-нибудь подсказка, которая заставит оптимизатор выполнить подпункт 'm'?

1 Ответ

0 голосов
/ 14 апреля 2019

Попробуйте:

Опция 0:

INSERT ...
WITH
  temp AS (...),
  m AS (...)
SELECT ...
FROM temp JOIN m;

Опция 1:

INSERT ...
WITH
  temp AS (...),
  m AS (...)
SELECT ...
FROM temp, m;

Опция 2:

INSERT ...
WITH
  temp AS (...)
SELECT ...
FROM temp, (...) m;
...