webentwicklung-frage-antwort-db.com.de

Temporäre Tabellen in SQL erstellen

Ich versuche eine temporäre Tabelle zu erstellen, die nur die Daten für einen bestimmten register_type Auswählt. Ich habe diese Abfrage geschrieben, aber sie funktioniert nicht:

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

Ich benutze PostgreSQL.
Könnten Sie mir bitte sagen, was mit der Abfrage nicht stimmt?

47
user1970850

Sie möchten wahrscheinlich CREATE TABLE AS - funktioniert auch für TEMPORARY (TEMP) Tabellen:

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

Dadurch wird eine temporäre Tabelle erstellt und Daten in diese kopiert. Ein statischer Schnappschuss der Daten wohlgemerkt. Es ist wie bei einer normalen Tabelle, befindet sich jedoch in RAM, wenn temp_buffers Hoch genug eingestellt ist, ist nur in der aktuellen Sitzung sichtbar und stirbt am Ende davon. Wenn es mit ON COMMIT DROP Erstellt wird, stirbt es am Ende der Transaktion.

Temporäre Tabellen stehen in der Standardeinstellung an erster Stelle Schemasuchpfad, wobei andere sichtbare Tabellen mit demselben Namen ausgeblendet werden, sofern sie nicht durch ein Schema qualifiziert sind:

Wenn Sie dynamisch möchten, würden Sie CREATE VIEW - eine ganz andere Geschichte suchen.

Der SQL-Standard definiert auch und Postgres unterstützt auch: SELECT INTO.
Aber von seiner Verwendung wird abgeraten :

Verwenden Sie dazu am besten CREATE TABLE AS In neuem Code.

Eine zweite Syntaxvariante ist wirklich nicht erforderlich, und SELECT INTO Wird für die Zuweisung in plpgsql verwendet, wobei die SQL-Syntax folglich nicht möglich ist.

Verbunden:


CREATE TABLE LIKE (...) kopiert nur die Struktur aus einer anderen Tabelle und ohne Daten:

Die LIKE -Klausel gibt eine Tabelle an, aus der die neue Tabelle automatisch alle Spaltennamen, ihre Datentypen und ihre Nicht-Null-Einschränkungen kopiert.


Wenn Sie eine "temporäre" Tabelle nur zum Zweck einer einzelnen Abfrage benötigen (und sie dann verwerfen), ist eine "abgeleitete Tabelle" in einem CTE oder einer Unterabfrage mit erheblich weniger Aufwand verbunden:

90
5
Chains