在 SQL 中创建临时表

Posted

技术标签:

【中文标题】在 SQL 中创建临时表【英文标题】:Creating temporary tables in SQL 【发布时间】:2013-03-19 10:42:27 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可能想要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 中。它仅在当前 session 中可见,并在其结束时消失。当使用ON COMMIT DROP 创建时,它会在事务结束时消失。

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

How does the search_path influence identifier resolution and the "current schema"

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


SQL标准也定义了,Postgres也支持:SELECT INTO。 But its use is discouraged:

最好在新代码中为此目的使用CREATE TABLE AS

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

相关:

Combine two tables into a new one so that select rows from the other one are ignored ERROR: input parameters after one with a default value must also have defaults in Postgres

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

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


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

Change the execution plan of query in postgresql manually? Combine two SELECT queries in PostgreSQL Reuse computed select value Multiple CTE in single query Update with results of another sql

【讨论】:

可能您只是从问题中复制了该查询,但仍然在问:ORDER BYCREATE TEMP TABLE temp1 AS .. 有任何意义吗? @OtoShavadze:确实如此。虽然它在逻辑上没有区别,但它决定了插入行的物理顺序,这会对性能产生重大影响,即使是 RAM 中的临时表。 好的理解,虽然不知道行的物理顺序会影响性能。谢谢 你能在 Postgres 中给一个临时表起别名吗? @tdelozie 是的。鉴于您与我的意思相同的“别名”。请将您的问题作为新的问题提出,并附上必要的详细信息。【参考方案2】:

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

CREATE TEMP TABLE temp1 LIKE ...

【讨论】:

CREATE [TEMP] TABLE <target-table> LIKE <source-table> 创建表但没有用数据填充它,所以这不是 OP 所要求的。

以上是关于在 SQL 中创建临时表的主要内容,如果未能解决你的问题,请参考以下文章

在SQL存储过程中创建临时表

如何在 SQL 中创建临时表以用于多个 ADF 活动?

如何在 SQL Server 2012 中创建的临时表上查找索引列表

在 FUNCTION 中创建临时表 [重复]

在 MS access passthru 中创建 sql server 临时表

如何在 Oracle 数据库中创建临时表?