- Este tópico contém 6 respostas, 3 vozes e foi atualizado pela última vez 12 anos, 11 meses atrás por burga.
-
AutorPosts
-
20 de dezembro de 2011 às 4:23 pm #102268viniciusgaParticipante
Olá.
Alguem sabe me dizer a diferença entre insert all e insert first?
Se eu executo o seguinte comando tanto com all quanto com first, o resultado é o mesmo, porque?
insert first
when employee_id < 150 then into tabela01 values (employee_id, salary, manager_id) else into tabela02 values (department_id, salary) select employee_id, salary, manager_id, department_id from employees [/i]20 de dezembro de 2011 às 4:36 pm #102269burgaParticipanteBasicamente porque você usa duas condições exclusivas, ou seja, só entra no ELSE se não entrar no IF.
A diferença dos dois é que o FIRST pára de verificar as condições após a primeira vez que retornar TRUE na condição, enquanto que o ALL verifica todas as condições…
Pra ficar mais simples, se fosse:
insert first
when employee_id < 150 then
into tabela01 values (employee_id, salary, manager_id)
when employee_id < 250 then
into tabela02 values (employee_id, salary, manager_id)
else
into tabela03 values (department_id, salary)
select employee_id, salary, manager_id, department_id from employeesVocê notaria a diferença, que com o ALL sempre que ele inserisse na tabela 1 tb iria inserir na 2, pois ambas as condições seriam satisfeitas, mas não necessariamente o contrario, e com o first sempre inseriria em somente uma das tabelas…
20 de dezembro de 2011 às 4:52 pm #102270viniciusgaParticipanteBurga, muito obrigado pela resposta. Porém ainda não consegui entender na prática. O que eu havia entendido era exatamente o que você disse, quando retornar TRUE para uma condição ele iria parar de verificar as seguintes.
Porem eu rodei algo semelhante com o que você passou:
insert first
when employee_id < 150 then
into tabela01 values (employee_id, salary, manager_id)
when employee_id < 200 then
into tabela02 values (employee_id, salary, manager_id)
else
into tabela03 values (employee_id, salary, manager_id)
select employee_id, salary, manager_id, department_id from employees;Nesse caso o que eu imaginei que faria era que assim que ele verificasse a primeira condição ( < 150) ele iria encontrar registros. Encontrando seria TRUE, então iria inserir apenas na tabela01 e não iria nem verificar as seguintes.
Porem quando executo o que ocorre é que insere nas 3 tabelas. Tabela01 recebe os ID de 1 a 149, Tabela02 recebe os ID de 150 a 199, e Tabela03 recebe os ID de 200 pra frente…
Então não é igual ao INSERT ALL?
20 de dezembro de 2011 às 5:19 pm #102271burgaParticipanteNão, a verificação ele faz por registro… Então, se você fizer com o ALL você vai ver que ele irá inserir de 1 a 149 na tabela 1 e de 1 a 199 na tabela 2, o que difere do FIRST.
Essas verificações ele faz para cada registro retornado do seu SELECT… Com o FIRST, se um registro já entrar na condição <150, ele pára e vai pro próximo registro, com o ALL ele continua no mesmo registro até verificar todas as condições, e se outra condição também bater, ele faz a inserção…
20 de dezembro de 2011 às 5:28 pm #102272leandrolbsParticipantenão conhecia essa opção..
Muito legal, já me quebrou um galho na hora que vi…
vlw pessoal
20 de dezembro de 2011 às 5:31 pm #102273viniciusgaParticipanteValeu Burga !!
Demorou mais entendi.
Muito obrigado!
20 de dezembro de 2011 às 5:39 pm #102274burgaParticipanteAs ordens Vinicius!!
Leandro, essa funcionalidade é muito útil mesmo, principalmente se você está programando um ETL…
E também cai questões sobre isso na 1z-047 😉
-
AutorPosts
- Você deve fazer login para responder a este tópico.