56

我正在尝试创建一个临时表,它只选择某个特定的数据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。
你能告诉我查询有什么问题吗?

4

2 回答 2

108

您可能想要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;

这将创建一个临时表并将数据复制到其中。请注意,数据的静态快照。它就像一个普通的表,但如果temp_buffers设置得足够高,它会驻留在 RAM 中。它仅在当前会话中可见,并在会话结束时消失。当用它创建时,ON COMMIT DROP它会在事务结束时死掉。

临时表首先出现在默认模式搜索路径中,隐藏其他同名的可见表,除非模式限定:


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


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

最好CREATE TABLE AS在新代码中用于此目的。

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

有关的:


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

LIKE子句指定一个表,新表会自动从该表中复制所有列名、它们的数据类型和它们的非空约束。


如果您仅出于单个查询的目的需要一个“临时”表(然后丢弃它),那么 CTE 或子查询中的“派生表”的开销要少得多:

于 2013-03-29T09:40:11.430 回答
6

http://www.postgresql.org/docs/9.2/static/sql-createtable.html

CREATE TEMP TABLE temp1 LIKE ...
于 2013-03-28T20:20:49.013 回答