Como fazer um insert com um select embutido?

13 respostas
M

Minha dúvida é a seguinte: como posso fazer um insert que execute um select interno(dentro do mesmo)?
Quem puder ajudar, agradeço. :wink:

13 Respostas

T

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
M

Só mais uma dúvida, o exemplo mostrado a instrução insert não deveria possuir os values?
Obrigado pela ajuda. :wink:

T

Quando você quer usar o retorno de um select para fazer insert não é necessário utilizar o values do comando

M

Estou executando o seguinte código:
insert into ICO_ESQUEMA.tico_legislacao(SEQ_LEGISLACAO, SEQ_PESSOA, SEQ_CLASSIFICACAO, SEQ_LEGISLACAO_COMPLEMENTADA,
SEQ_LEGISLACAO_REGULAMENTADA, SEQ_LEGISLACAO_REVOGADA, NUM_LEGISLACAO,
DAT_LEGISLACAO, MES_LEGISLACAO, ANO_LEGISLACAO, NOM_LEGISLACAO, DSC_LEGISLACAO,
IND_REVOGADA, DAT_PUBLICACAO)
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’;

porém, exibe a seguinte mensagem: comando desconhecido, o que pode estar errado?

T

Os campos que estão no select tem que ser compativeis com os campos do insert.

J

Qual SGBD você está utilizando?
Tem alguns que não aceitam esse tipo de inserção

M

Mas os campos no select são compatíveis com os do insert, não há tipos diferentes.

T

Eu quis dizer em quantidade também. se são 5 campos para inserir, tem que ter 5 valores no select.

M

Então terei que utilizar mais de um select para isso.
Serão necessários vários selects ou inner joins.

T

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.

M

Tem como você postar um exemplo?

T
insert into teste(
  campo1, 
  campo2, 
  campo3)
select
  'J',
  campo4,
  campo4 + campo5
from
  outratabela
where
  campo1 > 10
M

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…

Criado 28 de abril de 2011
Ultima resposta 29 de abr. de 2011
Respostas 13
Participantes 4