2013-03-28 9 views
34

Ich versuche, eine temporäre Tabelle zu erstellen, die nur die Daten für eine bestimmte register_type auswählt. Ich schrieb diese Abfrage, aber es funktioniert nicht:Erstellen von temporären Tabellen in SQL

$ 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önnen Sie mir bitte sagen, was mit der Abfrage falsch ist?

+0

ich einen anderen Tisch verwende genannt rawdata.egauge tatsächlich – user1970850

+10

* nicht * Nachricht keine gültige Postgres Fehler funktioniert. Ihnen fehlt das Schlüsselwort 'AS', die Auswahl sollte nicht in Parathensis sein, und Sie haben kein Semikolon ('; '), um die Anweisung zu beenden. –

Antwort

70

Sie wollen 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

Dies schafft eine temporäre Tabelle und kopiert Daten hinein. A statischen Snapshot der Daten, wohlgemerkt. Es ist wie eine normale Tabelle, aber residiert im RAM, wenn temp_buffers hoch genug gesetzt ist, ist nur innerhalb der aktuellen Sitzung sichtbar und stirbt am Ende davon. Wenn es mit ON COMMIT DROP erstellt wird, stirbt es am Ende der Transaktion.

Temp Tabellen im Standard Schema-Suchpfad zuerst kommt, andere sichtbare Tabellen mit dem gleichen Namen zu verstecken, es sei denn Schemaqualifikation:

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

Der SQL-Standard definiert auch, und Postgres unterstützt auch: SELECT INTO .
But its use is discouraged:

Am besten ist es CREATE TABLE AS zu diesem Zweck in dem neuen Code zu verwenden.

Es gibt wirklich keine Notwendigkeit für eine zweite Syntaxvariante, und SELECT INTO werden für die Zuordnung in plpgsql verwendet, wobei die SQL-Syntax folglich nicht möglich ist.

Verwandte:


CREATE TABLE LIKE (...) nur kopiert die Struktur aus einer anderen Tabelle und keine 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 müssen nur für die Zwecke einer einzigen Abfrage (und entsorgen Sie sie dann) eine „abgeleitete Tabelle“ in einem WAK oder eine Unterabfrage kommt mit wesentlich weniger Aufwand:

+2

Wusste nicht, dass 'select in' entmutigt ist .... – Xin

Verwandte Themen