Estou aprendendo o PostgreSQL e tentando descobrir como criar uma tabela temporária ou uma WITH
declaração que possa ser usada no lugar da tabela regular, para fins de depuração.
Eu olhei a documentação para CREATE TABLE e ela diz que VALUES
pode ser usada como uma consulta, mas não dá exemplo; a documentação da VALUES
cláusula nela vinculada também não tem um exemplo?
Então, eu escrevi um teste simples da seguinte maneira:
DROP TABLE IF EXISTS lookup;
CREATE TEMP TABLE lookup (
key integer,
val numeric
) AS
VALUES (0,-99999), (1,100);
Mas o PostgreSQL (9.3) está reclamando
erro de sintaxe no "AS" ou próximo a ele
Minhas perguntas são:
Como posso corrigir a declaração acima?
Como posso adaptá-lo para ser usado em um
WITH block
?
Desde já, obrigado.
postgresql
syntax
tinlyx
fonte
fonte
Respostas:
EDIT: Estou deixando a resposta original aceita como está, mas observe que a edição abaixo, conforme sugerido por a_horse_with_no_name, é o método preferido para criar uma tabela temporária usando VALUES.
Se você deseja selecionar apenas alguns valores, em vez de apenas criar uma tabela e inseri-la, é possível fazer algo como:
Para realmente criar uma tabela temporária de maneira semelhante, use:
EDIT: Como apontado por a_horse_with_no_name, nos documentos afirma que
CREATE TABLE AS...
é funcionalmente semelhante aSELECT INTO ...
, mas que o primeiro é um superconjunto do último e queSELECT INTO
é usado no plpgslq para atribuir um valor a uma variável temporária - por isso falharia em Aquele caso. Portanto, enquanto os exemplos acima são válidos para SQL simples, oCREATE TABLE
formulário deve ser preferido.Observe, também dos comentários de a_horse_with_no_name, e na pergunta original do OP, isso inclui uma conversão para os tipos de dados corretos na lista de valores e usa uma instrução CTE (WITH).
Além disso, como apontado na resposta de Evan Carrol, uma consulta CTE é uma cerca de otimização , ou seja, a CTE é sempre materializada. Há muitas boas razões para usar CTEs, mas pode haver um impacto significativo no desempenho, se não for usado com cuidado. Existem, no entanto, muitos casos em que a cerca de otimização pode realmente melhorar o desempenho; portanto, isso é algo que você deve estar ciente, para não evitar cegamente.
fonte
WHERE ST_Intersects(geom, (SELECT geom FROM sometable)
ouWHERE ST_Intersects(geom, ST_Buffer(anothergeom, 10)
frequentemente, o planejador de consultas não usará o índice espacial porque a coluna geom não será mais sargável. Se você criar sua área de interesse em uma CTE inicial, esse problema desaparecerá. Também é super conveniente, se você deseja usar a mesma AOI em várias expressões adicionais na mesma consulta, o que não é incomum em um contexto GIS.create table as
precisa de uma instrução select:Você também pode reescrever isso para usar um CTE:
fonte
O problema são os tipos de dados. Se você removê-los, a instrução funcionará:
Você pode definir os tipos lançando os valores da primeira linha:
fonte
Você realmente não precisa criar uma tabela nem usar um CTE, se tudo o que você precisa é usar alguns valores em suas consultas. Você pode incorporá-los:
Em seguida, você pode obter um produto cartesiano com um
CROSS JOIN
(onde o outro relacionamento pode ser, é claro, uma tabela regular, exibição etc.). por exemplo:que produz:
Ou
JOIN
os valores com outro relacionamento (que novamente pode ser uma tabela, exibição etc.) regulares, por exemplo:que produz:
fonte
Primeiro, use sempre o padronizado
CREATE TABLE AS
,SELECT INTO
como sugerido em outras respostas, há uma sintaxe obsoleta há mais de uma década. Você pode usarCREATE TABLE AS
com um CTEEmbora muitas respostas aqui estejam sugerindo o uso de um CTE, isso não é preferível. De fato, é provavelmente um pouco mais lento. Apenas embrulhe como uma mesa.
Se você precisar escrever uma instrução select, também poderá fazer isso (e não precisará de um CTE).
Um CTE no PostgreSQL força a materialização. É uma cerca de otimização. Por esse motivo, geralmente não é uma boa ideia usá-los em qualquer lugar, exceto quando você entende os custos e sabe que isso proporciona uma melhoria de desempenho. Você pode ver a desaceleração aqui, por exemplo,
fonte
fonte