A consulta básica para construir o comando dinamicamente:
SELECT format('INSERT INTO %I (%I) SELECT %I FROM %I'
, tbl_des, col_des, col_src, tbl_src) As sql
FROM table3;
Isso produz uma consulta como:
INSERT INTO "Table2" (col2) SELECT col1 FROM "Table1"
Observe a ortografia em maiúsculas citada. Ao contrário dos comandos SQL, onde os identificadores sem aspas são convertidos em minúsculas automaticamente, as strings em sua tabela agora diferenciam maiúsculas de minúsculas!
Eu sugiro que você nunca identificadores de aspas duplas e use exclusivamente nomes legais em letras minúsculas.
Para automatizar:
DO
$$BEGIN
EXECUTE (
SELECT format('INSERT INTO %I (%I) SELECT %I FROM %I'
, tbl_des, col_des, col_src, tbl_src) As sql
FROM table3
-- WHERE table3_id = 123 -- select only *one* row!
);
END$$;
Você precisa para entender o
format()
função. Leia o manual
. Você também pode envolver isso em uma função plpgsql e passar parâmetros adicionais: