2017-02-07 5 views
2

In Postgres (Version 9.4 FWIW), eine INSERT INTO ... SELECT Abfrage scheint auf Spaltenposition basierend einzufügen, anstatt Name:Einfügen von Namen statt Position in Postgres

pg=# CREATE TEMPORARY TABLE x (a int, b int); 
CREATE TABLE 
pg=# INSERT INTO x (a, b) SELECT 1 as b, 2 as a; 
INSERT 0 1 
pg=# SELECT * FROM x; 
a | b 
---+--- 
1 | 2 
(1 row) 

Gibt es eine Möglichkeit, diese Abfrage oder etwas zu strukturieren ähnlich, dass die Spalten mit Namen statt Position eingefügt werden? Ich würde das Ergebnis will, hier zu sein:

pg=# SELECT * FROM x; 
a | b 
---+--- 
2 | 1 
(1 row) 

Der Kontext ist hier, dass der Inhalt der SELECT an einer anderen Stelle definiert werden als der Gesamt INSERT Anruf, so ist es schwierig, eine gemeinsame Ordnung zu erzwingen.

+1

Es gibt keine Möglichkeit, dies in SQL zu tun. –

+0

@LaurenzAlbe überprüfen Sie die clevere Antwort unten! – nicolaskruchten

Antwort

1

einfach die Abfrage in einer Unterabfrage verschieben:

INSERT INTO x (a, b) SELECT a, b FROM (SELECT 1 AS b, 2 AS a) src; 
+0

Ah, das ist eine großartige Lösung! Vielen Dank :) – nicolaskruchten

0

Sie definieren die Reihenfolge der Spalten mit der Insert-Anweisung:

INSERT INTO x (b, a) 
SELECT 1 as b, -- maps to first column above 
     2 as a; -- maps to second column above 
+0

Richtig, so viel ist klar, aber ich möchte, dass dies funktioniert, auch wenn die Reihenfolge zwischen den beiden Teilen der Abfrage nicht übereinstimmen ... Ich werde die Frage klären. – nicolaskruchten

+0

@nicolaskruchten Ich sehe, was du sagst ... Die untere Zeile ist, mit einem 'insert ... select', werden die Werte in' select' in der Reihenfolge eingefügt, die in den Klammern des 'INSERT' – JohnHC

+0

Checks definiert ist aus dem schlauen Trick, der das löste! – nicolaskruchten