在 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也支持:。 But its use is discouraged:SELECT INTO
最好在新代码中为此目的使用
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 PostgresCREATE 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 BY
对 CREATE 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 Server 2012 中创建的临时表上查找索引列表