Подтвердить что ты не робот

Создание временных таблиц в 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.
Не могли бы вы рассказать мне, что не так с запросом?

4b9b3361

Ответ 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 установлен достаточно высоким, он виден только в текущем сеансе и умирает в конце его. Когда он создан с помощью ON COMMIT DROP, он умирает в конце транзакции.

Таблицы Temp сначала идут по пути поиска схемы по умолчанию , скрывая другие видимые таблицы с тем же именем, если не указано:

Если вы хотите динамический, вы бы искали CREATE VIEW - совершенно другая история.

Стандарт SQL также определяет, и Postgres также поддерживает: SELECT INTO.
Но его использование не рекомендуется:

Лучше всего использовать CREATE TABLE AS для этой цели в новом коде.

Нет необходимости в другом варианте синтаксиса, а SELECT INTO используется для назначения в plpgsql, где синтаксис SQL, следовательно, невозможен.

по теме:


CREATE TABLE LIKE (...) копирует только структуру из другой таблицы и никаких данных:

В предложении LIKE указывается таблица, из которой новая таблица автоматически копирует все имена столбцов, их типы данных и их не-null.


Если вам нужна "временная" таблица только для одного запроса (а затем отбросить его), то "производная таблица" в CTE или в подзапросе происходит со значительно меньшими накладными расходами: