在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
– 也适用于TEMPORARY
( TEMP
)表:
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的结果
http://www.postgresql.org/docs/9.2/static/sql-createtable.html
CREATE TEMP TABLE temp1 LIKE ...