Jak wstawić wartości do tabeli z zapytania wybierającego w PostgreSQL?

Mam tabelę items (item_id serial, name varchar(10), item_group int) i tabelę items_ver (id serial, item_id int, name varchar(10), item_group int).

Teraz chcę wstawić wiersz do items_ver z items. Czy jest do tego jakaś krótka składnia SQL?

Próbowałem z:

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

, ale pojawia się błąd składni:

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

Próbowałem:

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

Działało lepiej, ale otrzymałem błąd:

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; 

Może to być spowodowane tym, że kolumny w tabelach są zdefiniowane w innej kolejności. Czy kolejność kolumn ma znaczenie? Miałem nadzieję, że PostgreSQL będzie pasował do nazw kolumn.

Odpowiedź

Kolejność kolumn ma znaczenie, więc czy (i tylko wtedy) kolejność kolumn dopasować możesz na przykład:

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

A jeśli nie pasują, możesz na przykład:

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

ale poleganie na kolejności kolumn jest błędem czekającym na wystąpienie (może się zmienić, podobnie jak liczba kolumn) – utrudnia również odczytanie SQL

Nie ma dobrego ” shortcut ”- powinieneś jawnie wymienić kolumny zarówno dla tabeli, do której wstawiasz, jak i dla zapytania, którego używasz dla danych źródłowych, np .:

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

dbfiddle tutaj

Odpowiedź

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

Dla tej samej tabeli

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

Odpowiedź

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; 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *