web-dev-qa-db-fra.com

Création de tables temporaires en SQL

J'essaie de créer une table temporaire qui sélectionne uniquement les données d'un certain register_type. J'ai écrit cette requête mais cela ne fonctionne pas:

$ 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 ) $

J'utilise PostgreSQL.
Pourriez-vous me dire ce qui ne va pas dans la requête?

47
user1970850

Vous voulez probablement CREATE TABLE AS - fonctionne également pour TEMPORARY (TEMP) les tables:

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

Cela crée une table temporaire et y copie des données. Un instantané statique des données, remarquez. C'est comme une table normale, mais réside dans RAM si temp_buffers Est défini assez haut, n'est visible que dans la session actuelle et meurt à la Une fois créé avec ON COMMIT DROP, il meurt à la fin de la transaction.

Les tables temporaires apparaissent en premier dans le chemin de recherche de schéma par défaut , en masquant les autres tables visibles du même nom, sauf si elles sont qualifiées de schéma:

Si vous voulez dynamique, vous chercherez CREATE VIEW - a histoire complètement différente.

Le standard SQL définit également, et Postgres prend également en charge: SELECT INTO.
Mais son utilisation est déconseillée :

Il est préférable d'utiliser CREATE TABLE AS À cette fin dans le nouveau code.

Une deuxième variante de syntaxe n'est pas nécessaire et SELECT INTO Est utilisé pour l'affectation dans plpgsql, où la syntaxe SQL n'est par conséquent pas possible.

En relation:


CREATE TABLE LIKE (...) ne copie que la structure d'une autre table et aucune donnée:

La clause LIKE spécifie une table à partir de laquelle la nouvelle table copie automatiquement tous les noms de colonne, leurs types de données et leurs contraintes non nulles.


Si vous avez besoin d’une table "temporaire" uniquement pour les besoins d’une requête unique (et que vous la jetez ensuite), une "table dérivée" dans un CTE ou un la sous-requête s'accompagne de beaucoup moins de frais généraux:

90
Erwin Brandstetter
5
Chains