Minha dúvida é a seguinte: como posso fazer um insert que execute um select interno(dentro do mesmo)?
Quem puder ajudar, agradeço. 
Como fazer um insert com um select embutido?
13 Respostas
Para fazer um insert proveniente de um select você faz assim:
insert into tabela (campo1, campo2, campo3)
select
valor1,
valor2,
valor3
from
outratabela
where
x = y
Só mais uma dúvida, o exemplo mostrado a instrução insert não deveria possuir os values?
Obrigado pela ajuda. 
Quando você quer usar o retorno de um select para fazer insert não é necessário utilizar o values do comando
Estou executando o seguinte código:
insert into ICO_ESQUEMA.tico_legislacao(SEQ_LEGISLACAO, SEQ_PESSOA, SEQ_CLASSIFICACAO, SEQ_LEGISLACAO_COMPLEMENTADA, select seq_pessoa from ICO_ESQUEMA.tico_orgao where sig_orgao = ‘ANP’;, select seq_classificacao from ICO_ESQUEMA.tico_classificacao where dsc_classificacao = ‘Presidência da República’;
SEQ_LEGISLACAO_REGULAMENTADA, SEQ_LEGISLACAO_REVOGADA, NUM_LEGISLACAO,
DAT_LEGISLACAO, MES_LEGISLACAO, ANO_LEGISLACAO, NOM_LEGISLACAO, DSC_LEGISLACAO,
IND_REVOGADA, DAT_PUBLICACAO)
porém, exibe a seguinte mensagem: comando desconhecido, o que pode estar errado?
Os campos que estão no select tem que ser compativeis com os campos do insert.
Qual SGBD você está utilizando?
Tem alguns que não aceitam esse tipo de inserção
Mas os campos no select são compatíveis com os do insert, não há tipos diferentes.
Eu quis dizer em quantidade também. se são 5 campos para inserir, tem que ter 5 valores no select.
Então terei que utilizar mais de um select para isso.
Serão necessários vários selects ou inner joins.
o select que tem os dados pode ter qualquer tipo de junção.
eu geralmente monto ele primeiro e depois insiro a parte do insert.
Tem como você postar um exemplo?
insert into teste(
campo1,
campo2,
campo3)
select
'J',
campo4,
campo4 + campo5
from
outratabela
where
campo1 > 10
insert into tabela1 (campo1, campo2, campo3)
select t1.campo1, t1.campo2, t2.campo1 from tabela1 t1 inner join tabela2 t2 on t1.id = t2.id_tabela1 where campo = ‘valor’
também poderia por exemplo pegar uma subquery que retorne uma unica linha e coluna e colocar como um campo da inserção (ao menos aqui no oracle eu ja precisei fazer isso…).
exemplo:
insert into tabela (num_linha, id_cliente, valor) values ( (select max(num_linha) from tabela where id_cliente = 3), 3, ‘Fulano’);
sim, eu não podia usar sequence para isso nesse caso, mas ai ja é outra história…