Tenta executar o select e jogar tudo que ele retornar para um resultset … depois faz um while para percorrer todos os valores armazenados dentro desse resultset … e enfim … faz o insert em outra tabela !!
só mais uma maneira, eu, usando um banco oracle, faço isso assim:
BEGIN
FOR V_FUNC IN
(SELECT * FROM funcionarios WHERE salario < 500) -- aqui vc usa o select que quiser
LOOP
INSERT
INTO estagiarios
(
MATRICULA,
NOME,
ENDERECO,
SALARIO
)
VALUES
(
V_FUNC.MATRICULA,
V_FUNC.NOME,
V_FUNC.ENDERECO,
V_FUNC.SALARIO
)
;
END LOOP;
END;
claro, estou usando PL/SQL e portanto a logica acima so funciona em oracle. mas acredito que qualquer banco deve ter as funcoes de loop q sejam parecidas com o que fiz acima… mas, o INSERT INTO TABLE1 (A, B, C) VALUES (SELECT A, B, C FROM TABLE2); deve funcionar… so nao tenho certeza se deve-se usar o “values” ou não…
é q eu dei um exemplo muito simples, e nesse caso, realmente não precisava… vc pode usar uma instrução SQL padrão só:
INSERT
INTO estagiarios
(
MATRICULA,
NOME,
ENDERECO,
SALARIO
)
SELECT MATRICULA,
NOME,
ENDERECO,
SALARIO
FROM funcionarios
WHERE salario < 500
;
agora, quando as coisas começam a complicar, usar PL/SQL facilita a vida. digamos q a matricula dos estagiarios nao pudesse ser o mesmo numero de quando eles estavam na tabela de funcionarios, pois poderia esse numero ja estar em uso, e ele seja chave primaria. digamos q antes de inserir na tabela estagiarios eu quisesse descobrir uma matricula valida, então isso ajudaria:
DECLARE
V_MAT NUMBER(5, 0);
BEGIN
FOR V_FUNC IN
(SELECT * FROM funcionarios WHERE salario < 500) – aqui vc usa o select que quiser
LOOP
– primeiro faço uma lógica qualquer (exemplo, poderia ser algo mais complicado, aqui poderiamos ter varios “select into”)
SELECT MAX(MATRICULA) + 1
INTO V_MAT
FROM estagiarios;
– depois faço o insert, usando V_MAT
INSERT
INTO estagiarios
(
MATRICULA,
NOME,
ENDERECO,
SALARIO
)
VALUES
(
V_MAT,
V_FUNC.NOME,
V_FUNC.ENDERECO,
V_FUNC.SALARIO
)
;
END LOOP;
END;