Ich lerne PostgreSQL und versuche herauszufinden, wie man eine temporäre Tabelle oder eine WITH
Deklaration erstellt, die anstelle einer regulären Tabelle zum Debuggen verwendet werden kann.
Ich habe mir die Dokumentation zu CREATE TABLE angesehen und sie besagt, VALUES
dass sie als Abfrage verwendet werden kann, aber es gibt kein Beispiel. Die Dokumentation der VALUES
darin verlinkten Klausel hat auch kein Beispiel.
Also schrieb ich einen einfachen Test wie folgt:
DROP TABLE IF EXISTS lookup;
CREATE TEMP TABLE lookup (
key integer,
val numeric
) AS
VALUES (0,-99999), (1,100);
Aber PostgreSQL (9.3) beschwert sich darüber
Syntaxfehler bei oder in der Nähe von "AS"
Meine Fragen sind:
Wie kann ich die obige Aussage korrigieren?
Wie kann ich es anpassen, um es in einem zu verwenden
WITH block
?
Danke im Voraus.
postgresql
syntax
Tinlyx
quelle
quelle
Antworten:
BEARBEITEN: Ich lasse die ursprünglich akzeptierte Antwort unverändert, beachte jedoch, dass die folgende Bearbeitung, wie von a_horse_with_no_name vorgeschlagen, die bevorzugte Methode zum Erstellen einer temporären Tabelle mit VALUES ist.
Wenn Sie nur aus einigen Werten auswählen möchten, anstatt nur eine Tabelle zu erstellen und in diese einzufügen, können Sie Folgendes tun:
Um eine temporäre Tabelle auf ähnliche Weise zu erstellen, verwenden Sie:
BEARBEITEN: Wie in a_horse_with_no_name ausgeführt, wird in den Dokumenten angegeben , dass dies
CREATE TABLE AS...
funktional ähnlichSELECT INTO ...
ist, dass jedoch erstere eine Obermenge der letzterenSELECT INTO
ist und in plpgslq zum Zuweisen eines Werts zu einer temporären Variablen verwendet wird - dies würde fehlschlagen dieser Fall. Während die obigen Beispiele für einfaches SQL gültig sind,CREATE TABLE
sollte daher die Form bevorzugt werden.Beachten Sie auch, dass in den Kommentaren von a_horse_with_no_name und in der ursprünglichen Frage des OP eine Umwandlung in die richtigen Datentypen in der Werteliste enthalten ist und eine CTE (WITH) -Anweisung verwendet wird.
Wie in der Antwort von Evan Carrol ausgeführt, ist eine CTE-Abfrage auch ein Optimierungsbereich , dh, der CTE wird immer materialisiert. Es gibt viele gute Gründe für die Verwendung von CTEs, aber wenn sie nicht sorgfältig verwendet werden, kann dies zu erheblichen Leistungseinbußen führen. Es gibt jedoch viele Fälle, in denen der Optimierungsbereich die Leistung tatsächlich verbessern kann. Beachten Sie dies, und vermeiden Sie dies nicht blind.
quelle
WHERE ST_Intersects(geom, (SELECT geom FROM sometable)
oder haben, verwendetWHERE ST_Intersects(geom, ST_Buffer(anothergeom, 10)
der Abfrageplaner häufig nicht den räumlichen Index, da die geom-Spalte nicht mehr sargable ist. Wenn Sie Ihren Interessenbereich in einem anfänglichen CTE erstellen, wird dieses Problem behoben. Es ist auch sehr praktisch, wenn Sie dasselbe aoi in mehreren weiteren Ausdrücken in derselben Abfrage verwenden möchten, was in einem GIS-Kontext nicht ungewöhnlich ist.create table as
braucht eine select-Anweisung:Sie können dies auch neu schreiben, um einen CTE zu verwenden:
quelle
Das Problem sind die Datentypen. Wenn Sie sie entfernen, funktioniert die Anweisung:
Sie können die Typen definieren, indem Sie die Werte der ersten Zeile umwandeln:
quelle
Sie müssen weder eine Tabelle erstellen noch einen CTE verwenden, wenn Sie nur einige Werte in Ihren Abfragen verwenden möchten. Sie können sie einbinden:
Dann können Sie ein kartesisches Produkt mit a erhalten
CROSS JOIN
(wobei die andere Beziehung natürlich eine reguläre Tabelle, eine Ansicht usw. sein kann). z.B:was ergibt:
Oder
JOIN
die Werte mit einer anderen Beziehung (die wiederum eine reguläre Tabelle, Ansicht usw. sein kann), z.was ergibt:
quelle
Verwenden Sie zunächst immer die standardisierte
CREATE TABLE AS
,SELECT INTO
wie in anderen Antworten bereits seit über einem Jahrzehnt veraltete Syntax. Sie könnenCREATE TABLE AS
mit einem CTE verwendenWährend viele Antworten hier die Verwendung eines CTE vorschlagen, ist dies nicht vorzuziehen. In der Tat ist es wahrscheinlich etwas langsamer. Einfach als Tisch einpacken.
Wenn Sie eine select-Anweisung schreiben müssen, können Sie dies auch tun (und Sie benötigen keinen CTE).
Ein CTE in PostgreSQL erzwingt die Materialisierung. Es ist ein Optimierungszaun. Aus diesem Grund ist es im Allgemeinen keine gute Idee, sie überall zu verwenden, es sei denn, Sie kennen die Kosten und wissen, dass sie eine Leistungsverbesserung bewirken. Sie können die Verlangsamung hier sehen, zum Beispiel,
quelle
quelle