Estoy buscando insertar un par de valores asociados a un par de identificaciones sin codificar esas identificaciones en la consulta.
Más concretamente, tengo esta tabla foo :
create table if not exists foo(id int, val text);y puedo insertar mis valores haciendo:
insert into foo values (10, 'qwe_1'), (10, 'qwe_2'), (10, 'qwe_3'), (20, 'qwe_2'), (20, 'asd_3'), (20, 'asd_4'); pero no quiero repetir esos 10 y 20 .
Hice una pregunta similar hace un tiempo ( SQL - Usar CON para declarar variable en INSERTAR EN ) pero no resuelve mi problema. Tampoco puedo entender cómo usar una combinación o similar como se sugiere en INSERTAR valores repetidos en SQL , ya que la lista de valores que quiero agregar por identificación es arbitraria.
Si bien no es estrictamente necesario, me gustaría usar una declaración with para declarar primero mis identificaciones:
with c (first_id, second_id) as (values (10, 20)) select * from c; pero no entiendo cómo combinar eso con la declaración de insert into . Tengo esta consulta que no funciona pero que ilustra lo que estoy tratando de lograr:
with c (first_id, second_id) as (values (10, 20)) insert into foo values (c.first_id, 'qwe_1'), (c.first_id, 'qwe_2'), (c.first_id, 'qwe_3'), (c.second_id, 'qwe_2'), (c.second_id, 'asd_3'), (c.second_id, 'asd_4') from c; Tengo entendido que la declaración de values (...), ... devuelve una tabla, así que tal vez lo que me falta es una forma de combinar esta tabla con la tabla c .
Podrías usar una unión lateral:
insert into foo (id, val) select v.id, v.val from (values (10, 20)) c(first_id, second_id) cross join lateral (values (c.first_id, 'qwe_1'), (c.first_id, 'qwe_2'), (c.first_id, 'qwe_3'), (c.second_id, 'qwe_2'), (c.second_id, 'asd_3'), (c.second_id, 'asd_4') ) v(id, val);Si puede usar una estructura de bloques, usaría esa ruta.
do $$ DEFINE v_first_id NUMBER := 10; v_second_id NUMBER := 20; BEGIN ... Your Insert Statement ... END; $$