Estoy aprendiendo PostgreSQL y tratando de descubrir cómo crear una tabla temporal o una WITH
declaración que pueda usarse en lugar de una tabla normal, con fines de depuración.
Miré la documentación de CREATE TABLE y dice que VALUES
se puede usar como una consulta, pero no da ningún ejemplo; ¿la documentación para la VALUES
cláusula vinculada allí tampoco tiene un ejemplo?
Entonces, escribí una prueba simple de la siguiente manera:
DROP TABLE IF EXISTS lookup;
CREATE TEMP TABLE lookup (
key integer,
val numeric
) AS
VALUES (0,-99999), (1,100);
Pero PostgreSQL (9.3) se queja de
error de sintaxis en o cerca de "AS"
Mis preguntas son:
¿Cómo puedo arreglar la declaración anterior?
¿Cómo puedo adaptarlo para usarlo en a
WITH block
?
Gracias por adelantado.
postgresql
syntax
tinlyx
fuente
fuente
Respuestas:
EDITAR: Dejo la respuesta original aceptada 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 VALUES.
Si solo desea seleccionar algunos valores, en lugar de simplemente crear una tabla e insertarla, puede hacer algo como:
Para crear una tabla temporal de manera similar, use:
EDITAR: Como lo señala a_horse_with_no_name, en los documentos dice que
CREATE TABLE AS...
es funcionalmente similar aSELECT INTO ...
, pero que el primero es un superconjunto del último y queSELECT INTO
se usa en plpgslq para asignar un valor a una variable temporal, por lo que fallará en Ese caso. Por lo tanto, si bien los ejemplos anteriores son válidos para SQL simple, seCREATE TABLE
debe preferir la forma.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 utiliza una instrucción CTE (WITH).
Además, como se señala en la respuesta de Evan Carrol, una consulta CTE es una valla de optimización , es decir, el CTE siempre se materializa. Hay muchas buenas razones para usar CTE, pero puede haber un impacto en el rendimiento bastante significativo, si no se usa con cuidado. Sin embargo, hay muchos casos en los que la cerca de optimización puede mejorar el rendimiento, por lo que es algo a tener en cuenta, no evitar a ciegas.
fuente
WHERE ST_Intersects(geom, (SELECT geom FROM sometable)
oWHERE ST_Intersects(geom, ST_Buffer(anothergeom, 10)
, a menudo, el planificador de consultas no usa el índice espacial porque la columna geom ya no se puede modificar. Si crea su área de interés en un CTE inicial, este problema desaparece. También es muy conveniente, si desea utilizar el mismo aoi en varias expresiones adicionales en la misma consulta, lo que no es raro en un contexto SIG.create table as
necesita una declaración select:También puede volver a escribir esto para usar un CTE:
fuente
El problema son los tipos de datos. Si los elimina, la declaración funcionará:
Puede definir los tipos mediante la conversión de los valores de la primera fila:
fuente
Realmente no necesita crear una tabla ni usar un CTE, si todo lo que necesita es usar algunos valores en sus consultas. Puedes incluirlos en línea:
Luego puede obtener un producto cartesiano con un
CROSS JOIN
(donde la otra relación puede ser, por supuesto, una tabla normal, vista, etc.). p.ej:cuyos rendimientos:
O
JOIN
los valores con otra relación (que nuevamente puede ser una tabla, vista, etc.), por ejemplo:cuyos rendimientos:
fuente
Primero siempre use el estandarizado
CREATE TABLE AS
,SELECT INTO
como se sugiere en otras respuestas, ha sido una sintaxis obsoleta durante más de una década. Puedes usarCREATE TABLE AS
con un CTESi bien muchas respuestas aquí sugieren usar un CTE, eso no es preferible. De hecho, es probable que sea algo más lento. Solo envuélvelo como una mesa.
Si debe escribir una declaración select, también puede hacerlo (y no necesita un CTE).
Un CTE en PostgreSQL fuerza la materialización. Es una valla de optimización. Por esa razón, generalmente no es una buena idea usarlos en cualquier lugar, excepto cuando comprende los costos y sabe que proporciona una mejora en el rendimiento. Puedes ver la desaceleración aquí, por ejemplo,
fuente
fuente