2012-08-25 25 views
17

estoy tratando de ejecutar el siguiente Ensayos sencilla la creación de una tabla temporal, y luego unificante dos selecciones diferentes:¿No se puede UNION TODO en una tabla temporal?

CREATE TEMPORARY TABLE tmp 
SELECT * FROM people; 

SELECT * FROM tmp 
UNION ALL 
SELECT * FROM tmp; 

Pero conseguir un #1137 - Can't reopen table: 'tmp'

pensé que se suponía tablas temporales que dure la sesión . ¿Cuál es el problema aquí?

+1

posible duplicado de [Moverse por MySQL "No se puede abrir de nuevo la tabla de" error] (http://stackoverflow.com/questions/343402/get-around-mysql-cant-reopen-table-error) – LittleBobbyTables

+1

@ LittleBobby- No ve ninguna solución aplicable en esa – Yarin

+0

¿Cuántas tablas temporales diferentes necesita usar ...? – heretolearn

Respuesta

14

Este error indica que el modo en que las tablas de MySQL gestiona las tablas temporales se ha cambiado el cual a su vez afecta a las uniones, sindicatos, así como subconsultas. Para reparar el error de MySQL no puede abrir de nuevo la tabla, pruebe la siguiente solución:

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; 

Después de esto se puede realizar la operación de unión.

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

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

+1

Esto funciona, pero la duplicación de tablas temporales no parece ser mejor que crear 2 desde la fuente. – Yarin

+0

La tabla temporal se elimina cuando finaliza la sesión actual del cliente.Vea http://www.tutorialspoint.com/mysql/mysql-temporary-tables.htm – heretolearn

+0

He encontrado una buena [respuesta] (http: // stackoverflow.com/a/12122220/165673) basado en esto, gracias por dirigirme en la dirección correcta – Yarin

6

tal como se documenta en virtud de TEMPORARY Table Problems:

No puede referirse a una tabla TEMPORARY más de una vez en la misma consulta. Por ejemplo, el siguiente no funciona:

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

Este error también se produce si se hace referencia a una tabla temporal varias veces en una función almacenada bajo diferentes alias, aunque las referencias se encuentran en diferentes estados dentro de la función.

+7

¿REALMENTE? Eso parece soplar el 90% de su utilidad. ¿Me estoy perdiendo una solución obvia? – Yarin

+0

Bueno, puedes acceder a ellos en otra consulta ... –

+0

Sam- ¿cómo harías eso en este caso? – Yarin

6

lo descubrió gracias a sshekar's respuesta- la solución en este caso sería

  1. Crear una tabla temporal vacío
  2. Inserte los resultados que queremos UNIÓN en la tabla por separado
  3. Consultar la tabla de temperatura

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; 

(Ver Using MySQL Temporary Tables to save your brain)

+3

O simplemente 'CREATE TEMPORARY TABLE tmp SELECT * FROM personas UNION ALL SELECT * FROM people'? – eggyal

Cuestiones relacionadas