Wie füge ich Werte aus einer ausgewählten Abfrage in PostgreSQL in eine Tabelle ein?

Ich habe eine Tabelle items (item_id serial, name varchar(10), item_group int) und eine Tabelle items_ver (id serial, item_id int, name varchar(10), item_group int).

Jetzt möchte ich eine Zeile in items_ver von items einfügen. Gibt es dafür eine kurze SQL-Syntax?

Ich habe es versucht mit:

INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item_id = 2); 

, aber ich erhalte einen Syntaxfehler:

ERROR: syntax error at or near "select" LINE 1: INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item... 

Ich habe jetzt versucht:

INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2; 

Es hat besser funktioniert, aber ich habe Ein Fehler:

ERROR: column "item_group" is of type integer but expression is of type character varying LINE 1: INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2; 

Dies kann daran liegen, dass die Spalten in den Tabellen in einer anderen Reihenfolge definiert sind. Ist die Spaltenreihenfolge wichtig? Ich hoffte, dass PostgreSQL mit den Spaltennamen übereinstimmt.

Antwort

Die Spaltenreihenfolge spielt eine Rolle, wenn (und nur wenn) die Spaltenreihenfolge Sie können beispielsweise übereinstimmen:

insert into items_ver select * from items where item_id=2; 

Wenn sie nicht übereinstimmen, können Sie beispielsweise Folgendes tun:

insert into items_ver(item_id, item_group, name) select * from items where item_id=2; 

, aber das Verlassen auf die Spaltenreihenfolge ist ein Fehler, der darauf wartet, aufgetreten zu werden (er kann sich ändern, ebenso wie die Anzahl der Spalten) – es erschwert auch das Lesen von SQL.

Es gibt kein gutes “ Verknüpfung „- Sie sollten Spalten sowohl für die Tabelle, in die Sie einfügen, als auch für die Abfrage, die Sie für die Quelldaten verwenden, explizit auflisten, z. B.:

insert into items_ver (item_id, name, item_group) select item_id, name, item_group from items where item_id=2; 

dbfiddle hier

Antwort

INSERT INTO test_import_two (name, name1, name2) (SELECT name, name1, name2 FROM test_import_one WHERE id = 2) 

Für dieselbe Tabelle

INSERT INTO test_import_three (id1, name1, name2) (SELECT 216 ,name1, name2 FROM test_import_three WHERE id = 4) 

Antwort

INSERT INTO gate_pass( site_id, gate_pass_element, sequence_no, createdby, createddate, lastmodifiedby, lastmodifieddate) SELECT 1, gatepasselement, 3, 1,now(),1,now() FROM unnest(string_to_array("Bhushan,Amol,pallavi", E",")) as gatepasselement; 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.