首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将临时表创建为select union,所有这些都不在MySQL 5.6.17中工作,而是在MySQL 8上工作

问将临时表创建为select union,所有这些都不在MySQL 5.6.17中工作,而是在MySQL 8上工作
EN

Stack Overflow用户
提问于 2021-05-21 05:29:57
回答 2查看 310关注 0票数 0

有人能告诉我为什么这不管用吗?

代码语言:javascript
复制
DROP TEMPORARY TABLE IF EXISTS tmp_date_range;
CREATE TEMPORARY TABLE tmp_date_range AS (
    SELECT 1 AS `from`, 5 AS `to`
    UNION ALL
    SELECT 6, 10
    UNION ALL
    SELECT 11, 15
    UNION ALL
    SELECT 16, 20
    UNION ALL
    SELECT 21, 25
    UNION ALL
    SELECT 26, 100
);

但是当我把所有的工会都移走的时候,它就起作用了。

代码语言:javascript
复制
DROP TEMPORARY TABLE IF EXISTS tmp_date_range;
CREATE TEMPORARY TABLE tmp_date_range AS (
    SELECT 1 AS `from`, 5 AS `to`
);

在MySQL 8中,它运行得很好,但是我必须重新编码它才能在MySQL 5上工作,所以我创建了以下内容:

代码语言:javascript
复制
DROP TEMPORARY TABLE IF EXISTS tmp_date_range;
CREATE TEMPORARY TABLE tmp_date_range(
    `id` INT NOT NULL AUTO_INCREMENT,
    `from` INT NULL,
    `to` INT NULL,
PRIMARY KEY (id)
);

INSERT INTO tmp_date_range (`from`, `to`)
SELECT 1 AS `from`, 5 AS `to`
UNION ALL
SELECT 6, 10
UNION ALL
SELECT 11, 15
UNION ALL
SELECT 16, 20
UNION ALL
SELECT 21, 25
UNION ALL
SELECT 26, 100;

这是错误代码:错误代码: 1064。您的SQL语法出现错误;请检查与您的MySQL服务器版本对应的手册,以获得在第17行使用“UNION ALL SELECT 6,10 UNION全部选择11,15U”附近的正确语法

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-21 07:11:08

阅读@FaNo_FN的答案,这也是有效的:

代码语言:javascript
复制
DROP TEMPORARY TABLE IF EXISTS tmp_date_range;
CREATE TEMPORARY TABLE tmp_date_range AS select * from (
    SELECT 1 AS `from`, 5 AS `to`
    UNION ALL
    SELECT 6, 10
    UNION ALL
    SELECT 11, 15
    UNION ALL
    SELECT 16, 20
    UNION ALL
    SELECT 21, 25
    UNION ALL
    SELECT 26, 100
) x;

小提琴

票数 1
EN

Stack Overflow用户

发布于 2021-05-21 06:50:12

看来,如果您运行一个带有单个圆括号( MySQL )的SELECT,那么UNION版本5.7及更低版本将返回错误。

例如,在MySQL 5.7及更低版本中,此查询将成功运行:

代码语言:javascript
复制
SELECT 1 UNION ALL SELECT 2;

此查询也将成功运行:

代码语言:javascript
复制
(SELECT 1) UNION ALL (SELECT 2);

此查询将返回错误:

代码语言:javascript
复制
(SELECT 1 UNION ALL SELECT 2);

Error 1064: You have an error in your SQL syntax; 
        check the manual that corresponds to your MySQL server version for the 
         right syntax to use near 'UNION ALL SELECT 2)' at line 1

因此,由于这一限制,旧版本的MySQL版本中的查询将返回错误:

代码语言:javascript
复制
DROP TEMPORARY TABLE IF EXISTS tmp_date_range;
CREATE TEMPORARY TABLE tmp_date_range AS (  <--- because of this parenthesis 
    SELECT 1 AS `from`, 5 AS `to`
    UNION ALL
    SELECT 6, 10
    UNION ALL
    SELECT 11, 15
    UNION ALL
    SELECT 16, 20
    UNION ALL
    SELECT 21, 25
    UNION ALL
    SELECT 26, 100
) <--- because of this parenthesis 
;

相反,如果您删除括号,它应该可以工作。小提琴

我在正式文档中找不到任何能确切解释为什么它会那样运行的东西,但是有一个关于MySQL v8诉5.7中的联盟的文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67631274

复制
相关文章

相似问题

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