我对 mariaDB 有一个查询:
SELECT AVG(selectOnStop.time_avg) AS global_avg_time,
AVG(selectFromStopTaskProcessor.time_avg) AS qmr_task_time,
AVG(selectOnStop.time_avg) - AVG(selectFromStopTaskProcessor.time_avg) AS postprocessing
FROM (SELECT
global_task_id,
SUM(time_from_start),
SUM(time_from_start) / 1000000 AS time_avg
FROM task AS t
INNER JOIN recorderevent AS r ON (CONCAT(r.task_id, '0', SUBSTRING(r.`shard_alias` FROM 7)) = t.id)
WHERE r.event_name = 'STOP'
GROUP BY global_task_id
ORDER BY SUM(time_from_start) DESC) AS selectOnStop
JOIN (SELECT global_task_id, SUM(time_from_start) / 1000000 AS time_avg
FROM task AS t
INNER JOIN recorderevent AS r ON (CONCAT(r.task_id, '0', SUBSTRING(r.`shard_alias` FROM 7)) = t.id)
WHERE r.event_name = 'QMR_STOP_TASK_PROCESSOR'
GROUP BY global_task_id
ORDER BY SUM(time_from_start) DESC) AS selectFromStopTaskProcessor;
该请求正在运行。我决定使用 WITH 语句重写它。
WITH selectOnStop (time_start, time_avg) AS (SELECT
SUM(time_from_start) AS time_start,
SUM(time_from_start) / 1000000 AS time_avg
FROM task AS t
INNER JOIN recorderevent AS r
ON (CONCAT(r.task_id, '0', SUBSTRING(r.`shard_alias` FROM 7)) = t.id)
WHERE r.event_name = 'STOP'
GROUP BY global_task_id
ORDER BY SUM(time_from_start) DESC)
,
selectFromStopTaskProcessor (time_average) AS (SELECT SUM(time_from_start) / 1000000 AS time_average
FROM task AS t
INNER JOIN recorderevent AS r
ON (CONCAT(r.task_id, '0', SUBSTRING(r.`shard_alias` FROM 7)) = t.id)
WHERE r.event_name = 'QMR_STOP_TASK_PROCESSOR'
GROUP BY global_task_id
ORDER BY SUM(time_from_start) DESC)
SELECT AVG(selectOnStop.time_avg) AS global_avg_time,
AVG(selectFromStopTaskProcessor.time_average) AS qmr_task_time,
AVG(selectOnStop.time_avg) - AVG(selectFromStopTaskProcessor.time_average) AS postprocessing
FROM selectOnStop
JOIN selectFromStopTaskProcessor;
事实上,我只是将选择移到单独的查询中。写入以下内容:
[42000][1064] (conn=3) 检查与您的 MariaDB 服务器版本相对应的手册,以了解在 'selectOnStop (time_start, time_avg) AS (SELECT [42000][1064]在第 1 行的 'selectOnStop (time_start, time_avg) AS (SELECT ' 附近使用正确语法的服务器版本查询是: WITH selectOnStop (time_start, time_avg) AS (SELECT SUM(time_from_start) AS time_sta ...
告诉我我做错了什么,以及需要在请求中更正哪些内容才能使其正常工作?
当收到看似正确的请求的语法错误时,遵循错误文本中的建议是有意义的:
并检查有关您的 DBMS 版本的此语法的文档。
对于
mariadb
表达式支持,不久前WITH
出现在 alpha 版本10.2.1中。第一个稳定版本是 10.2.6。您有版本 10.1.37 - 即以前的分支,因此尚不支持它。common table expression
CTE