postgresql-在SQL中创建临时表

我试图创建一个临时表,该表仅选择特定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。
您能否告诉我查询的问题是什么?

user1970850 asked 2020-02-12T23:35:35Z
2个解决方案
91 votes

您可能想要LIKE-也适用于LIKEplpgsql)表格:

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

这将创建一个临时表并将数据复制到其中。 请注意,数据的静态快照。 它就像一张普通表,但是如果将LIKE设置得足够高,则驻留在RAM中,仅在当前会话中可见,并在其末尾死掉。 使用plpgsql创建时,它将在事务结束时死亡。

临时表在默认架构搜索路径中排在第一位,除非架构合格,否则隐藏其他相同名称的可见表:

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

如果您想要动态,那么您将寻找LIKE-一个完全不同的故事。

SQL标准也进行了定义,Postgres也支持:LIKE
但是不建议使用:

为此,最好在新代码中使用LIKE

确实不需要第二种语法变体,并且plpgsql用于plpgsql中的赋值,因此无法使用SQL语法。

有关:

  • 将两个表合并为一个新表,以便忽略另一个表中的选择行
  • 错误:带默认值的输入参数后面的输入参数也必须具有默认值

LIKE仅从另一个表复制该结构,而没有数据:

LIKE子句指定一个表,新表从该表开始   自动复制所有列名称,其数据类型及其   非空约束。


如果仅出于单个查询的目的而需要“临时”表(然后将其丢弃),则CTE或子查询中的“派生表”的开销将大大减少:

  • 在postgresql中手动更改查询的执行计划?
  • 在PostgreSQL中合并两个SELECT查询
  • 重用计算的选择值
  • 单个查询中有多个CTE
  • 用另一个SQL的结果更新
Erwin Brandstetter answered 2020-02-12T23:37:13Z
5 votes

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

CREATE TEMP TABLE temp1 LIKE ...
Chains answered 2020-02-12T23:37:33Z
translate from https://stackoverflow.com:/questions/15691243/creating-temporary-tables-in-sql