2012-02-09 12 views
39

Necesito crear una tabla temporal con las mismas columnas y escribir como una tabla permanente. ¿Cuál es la mejor manera de hacerlo? (La tabla Permanente tiene más de 100 columnas)La mejor manera de crear una tabla temporal con las mismas columnas y escribir como una tabla permanente

es decir

Por lo general, puedo crear tabla como ésta.

DECLARE #TT TABLE(    
    member_id INT,  
    reason varchar(1),  
    record_status varchar(1) ,  
    record_type varchar(1)  
) 

Pero ¿hay alguna manera de hacerlo sin mencionar los nombres de columna y tipo, pero mencionar el nombre de otra tabla con las columnas necesarias?

+1

eso no es una tabla temporal, esa es una variable de tabla. –

+0

@ nathangonzalez- sí, está ... actualizando la pregunta ... Creo que las respuestas se aplican a ambas ... aclare si no – Ananth

+0

@Ananth, las variables de la tabla deben declararse explícitamente, por lo que la forma en que era originalmente es casi tan buena como se pone. Las tablas temporales se pueden crear utilizando una instrucción 'select into', que es más a prueba de futuro y menos lenta que handtyping ddl –

Respuesta

86
select top 0 * 
into #mytemptable 
from myrealtable 
+1

+1 Estaba yendo con un "donde 0 = 1", pero su solución es más rápida. –

+1

@JoachimIsaksson - Solo por curiosidad, ¿cómo lo midieron? Hice algunas pruebas crudas por mi cuenta y no veo diferencia entre los dos. –

+0

@MikaelEriksson No hice un análisis más profundo pero vi una diferencia menor, ejecutando un servidor SQL anterior y el 0 superior parece no tener acceso a tablas o índices, mientras que donde 0 = 1 parece tener acceso al índice de clave principal. Sin embargo, no estoy seguro de cuán grande es la diferencia en cuanto al tiempo, no tengo una gran mesa para probar. Además, esto parece bastante dependiente de la implementación, por lo que puede ser diferente en las versiones más recientes. –

7

Sortest uno ...

select top 0 * into #temptable from mytable 

Nota: Esto crea una copia vacía de la temperatura, pero no crea una clave primaria

+0

esto también insertará todos los datos. –

+0

@nathangonzalez: lo intenté y la solución funcionó a la perfección. Solo la tabla se creó sin ningún dato – Ananth

+0

@Ananth, la respuesta fue editada después de mi comentario. –

1
select * into #temptable from tablename where 1<>1 
+0

si no me equivoco, la caída aquí es que el servidor sql tiene que evaluar 1 <> 1 para cada fila en la tabla. –

+2

@nathangonzalez: No, no es así. El optimizador no es tan tonto. –

+0

@ycubcube, entonces supongo que estoy equivocado. veo que hace un escaneo constante. supongo que debería haber verificado. –

7

Ésta es una Respuesta específica de MySQL, no estoy seguro de dónde más funciona:

Puede crear un t vacío poder tener las mismas definiciones de columna con:

CREATE TEMPORARY TABLE temp_foo LIKE foo; 

Además, puede crear una copia poblada de una tabla existente con:

CREATE TEMPORARY TABLE temp_foo SELECT * FROM foo; 

Y las siguientes obras en Postgres; lamentablemente los diferentes de RDBMS no parecen muy consistentes en:

CREATE TEMPORARY TABLE temp_foo AS SELECT * FROM foo; 
6

realizo esta pregunta es muy antigua, pero para aquellos que buscan una solución específica a PostgreSQL, es:

CREATE TEMP TABLE tmp_table AS SELECT * FROM original_table LIMIT 0; 

Nota, la La tabla temporal se colocará en un esquema como pg_temp_3.

Esto creará una tabla temporal que tendrá todas las columnas (sin índices) y sin los datos, sin embargo, dependiendo de sus necesidades, es posible que desee a continuación, elimine la clave principal:

ALTER TABLE pg_temp_3.tmp_table DROP COLUMN primary_key; 

Si la tabla original no tiene datos para comenzar, puede dejar el "LIMIT 0".

Cuestiones relacionadas