Pular para o conteúdo
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #102268
    viniciusga
    Participante

      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]

      #102269
      burga
      Participante

        Basicamente 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 employees

        Você 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…

        #102270
        viniciusga
        Participante

          Burga, 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?

          #102271
          burga
          Participante

            Nã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…

            #102272
            leandrolbs
            Participante

              não conhecia essa opção..

              Muito legal, já me quebrou um galho na hora que vi…

              vlw pessoal

              #102273
              viniciusga
              Participante

                Valeu Burga !!

                Demorou mais entendi.

                Muito obrigado!

                #102274
                burga
                Participante

                  As 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 😉

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.
                plugins premium WordPress