在临时桌上不能UNION ALL吗?

Yar*_*rin 21 mysql sql

我正在尝试运行以下简单测试 - 创建临时表,然后UNIONing两个不同的选择:

CREATE TEMPORARY TABLE tmp 
SELECT * FROM people;

SELECT * FROM tmp
UNION ALL
SELECT * FROM tmp;
Run Code Online (Sandbox Code Playgroud)

但得到一个 #1137 - Can't reopen table: 'tmp'

我认为临时表应该会持续会议.这有什么问题?

her*_*arn 15

此错误表示Mysql表管理临时表的方式已更改,这反过来又会影响联接,联合以及子查询.要修复mysql错误无法重新打开表,请尝试以下解决方案:

mysql> CREATE TEMPORARY TABLE tmp_journals_2 LIKE tmp_journals;

Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO tmp_journals_2 SELECT * FROM tmp_journals;
Run Code Online (Sandbox Code Playgroud)

在此之后,您可以执行联合操作.

http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html

http://www.mysqlrepair.org/mysqlrepair/cant-reopen-table.php


Yar*_*rin 8

通过sshekar的回答弄清楚了 - 在这种情况下的解决方案是

  1. 创建一个空的临时表
  2. 将我们想要的结果单独插入表中
  3. 查询临时表

SQL:

CREATE TEMPORARY TABLE tmp LIKE people;

INSERT INTO tmp SELECT * FROM people; /* First half of UNION */
INSERT INTO tmp SELECT * FROM people; /* Second half of UNION */
SELECT * FROM tmp; 
Run Code Online (Sandbox Code Playgroud)

(请参阅使用MySQL临时表来保存您的大脑)

  • 或者只是`CREATE TEMPORARY TABLE tmp SELECT*FROM people UNION ALL SELECT*FROM people`? (3认同)

egg*_*yal 6

TEMPORARY表格问题所述:

您不能TEMPORARY在同一查询中多次引用表.例如,以下内容不起作用:

mysql> SELECT * FROM temp_table, temp_table AS t2;
ERROR 1137: Can't reopen table: 'temp_table'

如果在不同别名下的存储函数中多次引用临时表,也会发生此错误,即使引用发生在函数内的不同语句中也是如此.

  • 真?这似乎只是吹走了90%的实用性.我错过了一个明显的解决方法吗? (8认同)