Saltar al contenido

Cómo crear una tabla temporal usando VALORES en PostgreSQL

Hola, tenemos la respuesta a lo que estabas buscando, desplázate y la hallarás más abajo.

Solución:

EDITAR: Dejo la respuesta aceptada original tal como está, pero tenga en cuenta que la edición a continuación, como lo sugiere a_horse_with_no_name, es el método preferido para crear una tabla temporal usando VALORES.

Si solo desea seleccionar entre algunos valores, en lugar de simplemente crear una tabla e insertarla, puede hacer algo como:

WITH  vals (k,v) AS (VALUES (0,-9999), (1, 100)) 
SELECT * FROM vals;

Para crear una tabla temporal de manera similar, use:

WITH  vals (k,v) AS (VALUES (0,-9999), (1, 100)) 
SELECT * INTO temporary table temp_table FROM vals;

EDITAR: Como lo señaló a_horse_with_no_name, en los documentos establece que CREATE TABLE AS... es funcionalmente similar a SELECT INTO ...pero que el primero es un superconjunto del segundo y que SELECT INTO se usa en plpgslq para asignar un valor a una variable temporal, por lo que fallaría en ese caso. Por lo tanto, mientras que los ejemplos anteriores son válidos para SQL simple, el CREATE TABLE Se debe preferir la forma.

CREATE TEMP TABLE temp_table AS                                     
WITH t (k, v) AS (
 VALUES
 (0::int,-99999::numeric), 
 (1::int,100::numeric)
)
SELECT * FROM t;

Tenga en cuenta, también de los comentarios de a_horse_with_no_name, y en la pregunta original del OP, esto incluye una conversión a los tipos de datos correctos dentro de la lista de valores y usa una declaración CTE (CON).

Además, como se señaló en la respuesta de Evan Carrol, en Postgres antes de la versión 12, una consulta CTE siempre es un valla de optimización, es decir, el CTE siempre se materializa. Hay muchas buenas razones para usar CTE, pero puede haber un impacto significativo en el rendimiento si no se usa con cuidado. Sin embargo, hay muchos casos en los que la valla de optimización puede mejorar el rendimiento, por lo que es algo que se debe tener en cuenta, no evitar ciegamente.

create table as necesita una declaración de selección:

DROP TABLE IF EXISTS lookup;
CREATE TEMP TABLE lookup 
as 
select *
from (
   VALUES 
    (0::int,-99999::numeric), 
    (1::int, 100::numeric)
) as t (key, value);

También puede volver a escribir esto para usar un CTE:

create temp table lookup 
as 
with t (key, value) as (
  values 
    (0::int,-99999::numeric), 
    (1::int,100::numeric)
)
select * from t;

El problema son los tipos de datos. Si los elimina, la declaración funcionará:

CREATE TEMP TABLE lookup
  (key, val) AS
VALUES 
  (0, -99999), 
  (1, 100) ;

Puede definir los tipos emitiendo los valores de la primera fila:

CREATE TEMP TABLE lookup 
  (key, val) AS
VALUES 
  (0::bigint, -99999::int), 
  (1, 100) ;

Tienes la posibilidad difundir esta división si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *