首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL 8.0:不带执行两个子句的CTE

MySQL 8.0:不带执行两个子句的CTE
EN

Stack Overflow用户
提问于 2019-04-14 15:41:04
回答 1查看 61关注 0票数 0

Percona MySQL 8.0.15-5

大家好,你能帮我解决一个问题吗?

我想使用临时表将查询重写为使用'with‘的CTE。此查询应执行从一个表到另一个表的数据阻塞。

工作流程如下:我们选择一批数据,将其插入到目标表中,然后从这批数据中选择最大的id,存储它,当进一步调用过程时,数据的选择从这个id开始。

‘'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的第二个查询,可能是因为我以后不会使用它。为了解决这个问题,我必须向主'select‘添加一个额外的'join’条件。

可以强制MySQL执行'm‘子句吗?也许有什么提示会迫使优化器执行'm‘子句?

EN

回答 1

Stack Overflow用户

发布于 2019-04-15 02:35:19

尝试:

选项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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55673044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档