Вы находитесь на странице: 1из 2

INSERT com SELECT - Verso para Impresso

http://www.dicas-l.com.br/freedb/print/freedb_20060917.html

INSERT com SELECT


Por Luiz Paulo de Oliveira Santos Data de Publicao: 17 de Setembro de 2006 Uma possibilidade interessante e desconhecida de muitos desenvolvedores que utilizam SQL o uso de duas instrues SQL em uma nica chamada. Por exemplo: A instruo INSERT que responsvel por inserir registros em tabelas, e, pode ser utilizada em conjunto com outras instrues, como o SELECT, por exemplo. A instruo SELECT do SQL alm de polmica bastante complexa. Com ela podemos extrair informaes dos mais diversos tipos, ou seja, podemos utilizar o SELECT para obter desde resultados de clculos bsicos at buscas complexas e mais elaboradas, como nos exemplos a seguir: SELECT 1+1 ou (SELECT * FROM `xoops_users` where (uid >1) and (uid < 5)) UNION (SELECT * FROM `xoops_users` where (uid >10) and (uid < 15)) ORDER BY uname; Podemos utilizar o SELECT para extrair informaes e canalizar o resultado obtido para outra instruo SQL. o proposto no ttulo do artigo, e o que ser demonstrado a seguir. Em uma situao onde existe a necessidade de gerar uma tabela de dados para ser trabalhada, e, ao final dos trabalhos ser exportada para outro sistema, por exemplo. Necessita-se importar dados de diferentes tabelas ou intervalos da tabela e colocar tudo em uma nica tabela (tabela resposta). Logo teremos que inserir registros na tabela que armazenar a resposta. A insero dos dados efetuada com a instruo INSERT, que bastante simples. Basicamente informa-se a tabela que receber os dados, os campos que sero preenchidos (e podem ser omitidos caso todos os campos sejam preenchidos) e a massa de dados que preencher os campos, conforme o exemplo: INSERT INTO <tabela> (lista de campos,...) VALUES (massa de dados); Sendo que a massa de dados deve obedecer a lista de campos informada. Supondo que exista a tabela respostas com a seguinte estrutura: Campo IDENVIO NOME Tipo INT(11) VARCHAR(50)

IDDESTINO INT(11) Para inserirmos um registro na tabela respostas a instruo INSERT ter a seguinte sintaxe: INSERT INTO respostas (IDENVIO, NOME, IDDESTINO) VALUES (11,"lpaulo",132); Para efetuarmos a importao devida, deve-se obter os campos IDENVIO e NOME da tabela xoops_users (nos campos uid e uname respectivamente) e o campo IDDESTINO da tabela xoops_xoopscomments (campo com_id). Logo, necessitam-se buscar dados em duas tabelas e armazenar a resposta na tabela respostas. Para buscar os dados nas tabelas utilizaremos um SELECT. Porm deve-se filtrar os registros da tabela xoops_xoopscomments,

1 de 2

10/07/2012 13:51

INSERT com SELECT - Verso para Impresso

http://www.dicas-l.com.br/freedb/print/freedb_20060917.html

de forma que para cada registro de xoops_users seja exibido com seu equivalente em xoops_xoopscomments. A seguir temos a instruo que faz a extrao dos dados: SELECT xoops_users.uid, xoops_users.uname, xoops_xoopscomments.com_id FROM xoops_users, xoops_xoopscomments WHERE xoops_users.uid = xoops_xoopscomments.com_uid No SELECT acima obtemos 3 campos, sendo dois deles INTEGER e um VARCHAR. Agora ser unido o SELECT ao INSERT: INSERT INTO `respostas` (IDENVIO, NOME, IDDESTINO) SELECT xoops_users.uid, xoops_users.uname, xoops_xoopscomments.com_id FROM xoops_users, xoops_xoopscomments WHERE xoops_users.uid = xoops_xoopscomments.com_uid Desta forma ser inserido na tabela respostas os registros obtidos na consulta com SELECT. Observe que a clausula VALUES foi omitida. Em alguns casos a clausula VALUES pode ser omitida e em outros casos no. Em uma prxima oportunidade o assunto ser estudado. E as variaes e aplicaes para esse tipo de sintaxe so simplesmente ilimitadas! O limite a necessidade e criatividade de cada um. Nota: O uso do INSERT em conjunto com SELECT muito til, porm deve-se lembrar sempre das formas normais que foram empregadas para normalizao do banco de dados. Se as formas normais no forem respeitadas, redundncias podem aparecer em seu banco! Mas formas normais assunto para outro bate papo. Espero que essa pequena dica seja til quando precisar "importar" dados provenientes de tabelas que j existam. Um forte abrao e at mais!

2 de 2

10/07/2012 13:51