在SQL中创build临时表

我正在尝试创build一个临时表,只select某个register_type的数据。 我写了这个查询,但它不起作用:

 $ CREATE TABLE temp1 (Select egauge.dataid, egauge.register_type, egauge.timestamp_localtime, egauge.read_value_avg from rawdata.egauge where register_type like '%gen%' order by dataid, timestamp_localtime ) $ 

我正在使用PostgreSQL。
你能告诉我什么是错误的查询?

您可能需要CREATE TABLE AS – 也适用于TEMPORARYTEMP )表:

 CREATE TEMP TABLE temp1 AS SELECT dataid , register_type , timestamp_localtime , read_value_avg FROM rawdata.egauge WHERE register_type LIKE '%gen%' ORDER BY dataid, timestamp_localtime 

这将创build一个临时表并将数据复制到其中。 数据的静态快照 ,介意你。 它就像常规表一样,但是如果temp_buffers被设置得足够高,就驻留在RAM中,只在当前会话中可见,并在结束时死掉。 当使用ON COMMIT DROP创build时,它在事务结束时死亡。

Temp表首先在默认模式searchpath中隐藏其他具有相同名称的可见表,除非是模式限定的:

  • search_path如何影响标识符parsing和“当前模式”

如果你想dynamic的 ,你会寻找CREATE VIEW – 一个完全不同的故事。

SQL标准也定义了,Postgres也支持: SELECT INTO
但是它的使用是不鼓励的 :

在新代码中最好使用CREATE TABLE AS来达到此目的。

实际上不需要第二个语法变体, SELECT INTO用于plpgsql中的赋值,因此SQL语法是不可能的。

有关:

  • 将两个表合并为一个新表,以便从另一个表中select行将被忽略
  • 错误:使用默认值之后的input参数也必须有默认值

CREATE TABLE LIKE (...)只复制另一个表的结构而没有数据:

LIKE子句指定一个表,新表自动复制所有列名,它们的数据types和它们的非空约束。


如果你只需要一个“临时”表就可以实现单个查询(然后放弃它),那么CTE或子查询中的“派生表”的开销就会小得多:

  • 手动更改postgresql中查询的执行计划?
  • 在PostgreSQL中组合两个SELECT查询
  • 重新使用计算的select值
  • 多个CTE在单个查询中
  • 更新另一个SQL的结果