¿Cómo insertar valores en una tabla desde una consulta de selección en PostgreSQL?

Tengo una tabla items (item_id serial, name varchar(10), item_group int) y una tabla items_ver (id serial, item_id int, name varchar(10), item_group int).

Ahora quiero insertar una fila en items_ver desde items. ¿Existe alguna sintaxis SQL corta para hacer esto?

He intentado con:

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

pero obtengo un error de sintaxis:

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

Ahora probé:

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

Funcionó mejor pero obtuve un error:

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; 

Esto puede deberse a que las columnas están definidas en un orden diferente en las tablas. ¿Importa el orden de las columnas? Esperaba que PostgreSQL coincidiera con los nombres de las columnas.

Respuesta

El orden de las columnas importa, así que si (y solo si) las órdenes de las columnas coincidir puede, por ejemplo:

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

O si no coinciden, podría, por ejemplo:

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

pero depender del orden de las columnas es un error que está a punto de ocurrir (puede cambiar, al igual que el número de columnas); también hace que su SQL sea más difícil de leer

No hay nada bueno acceso directo «: debe enumerar explícitamente las columnas de la tabla en la que está insertando y la consulta que está utilizando para los datos de origen, por ejemplo:

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

dbfiddle aquí

Responder

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

Para la misma tabla

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

Respuesta

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; 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *