【问题标题】:Creating temporary tables in SQL在 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。
你能告诉我查询有什么问题吗?

【问题讨论】:

    标签: sql postgresql temp-tables


    【解决方案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 创建时,它会在事务结束时消失。

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


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


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

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

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

    相关:


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

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


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

    【讨论】:

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

    【讨论】:

    • CREATE [TEMP] TABLE <target-table> LIKE <source-table> 创建表但没有用数据填充它,所以这不是 OP 所要求的。
    猜你喜欢
    • 2011-03-28
    • 2019-03-13
    • 1970-01-01
    • 2011-11-03
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多