Pular para o conteúdo
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #91891
    alvear
    Participante

      Bom dia colegas!

      Ao deparar com um problema, para elaborar um relatório, tive que fazer um Select um pouco complexo, com Vários SubSelcts, lendo apenas duas tabelas, porem, varias vezes.
      Agora estou com uma duvida.
      Qual solução seria mais rápida e funcional?
      O Select, ou criar um Tabela Temporária em tempo de execução, realizando a leitura das duas tabelas, um Insert, e outra leitura na tebela temporária, com algumas rotinas de repetição.

      Agradeço a todos pela ateção!
      E desejo um Bom Dia!

      #91908
      burga
      Participante

        Se puder postar o select e a estrutura das tabelas seria mais fácil de ajudarmos pois não existe uma coisa melhor que a outra, depende muito da situação… É difícil dar um diagnóstico de qual seria melhor sem entendermos o problema real.

        #91932
        sancler
        Participante

          Como o burga falou, com o seu select poderiamos opinar de forma melhor. Mas pelo que pude entender a cláusula WITH seria uma boa saída para seu problema.

          Espero ter ajduado!

          #91936
          alvear
          Participante

            Esse select, retorna um registro de uma tabela, que retorna um ultimo registro de outra tabela.Essas tabelas estao ligadas por um id. Tem mais outros parametros, mas o mais dificil, foi fazer esta ligação.
            Só que o BD utilizado foi o MySQL.
            Estou começando agora na área de Oracle, quer dizer, ainda não comecei, estou realizando o curso de formação Oracle.

            SELECT cadprocesso.idProcesso,cadprocesso.Processo, cadprocesso.NroVara, cadprocesso.Vara, cadprocesso.idCliente, cadprocesso.idReu, cadprocesso.UF, cadprocesso.Cidade, cadcli.RazSoc, cadreu.Nome,
            (SELECT idProcOcor FROM cadprococor WHERE idprococor = (SELECT MAX(idprococor) FROM cadprococor WHERE cadprocesso.idProcesso = cadprococor.idProcesso)) AS idProcOcor,
            (SELECT idProcesso FROM cadprococor WHERE idprococor = (SELECT MAX(idprococor) FROM cadprococor WHERE cadprocesso.idProcesso = cadprococor.idProcesso)) AS idProcesso,
            (SELECT idocorrencia FROM cadprococor WHERE idprococor = (SELECT MAX(idprococor) FROM cadprococor WHERE cadprocesso.idProcesso = cadprococor.idProcesso)) AS idOcorrencia,
            (SELECT DATA FROM cadprococor WHERE idprococor = (SELECT MAX(idprococor) FROM cadprococor WHERE cadprocesso.idProcesso = cadprococor.idProcesso)) AS DATA,
            (SELECT Ocorrencia1 FROM cadprococor WHERE idprococor = (SELECT MAX(idprococor) FROM cadprococor WHERE cadprocesso.idProcesso = cadprococor.idProcesso)) AS Ocorrencia1,
            (SELECT Ocorrencia2 FROM cadprococor WHERE idprococor = (SELECT MAX(idprococor)FROM cadprococor WHERE cadprocesso.idProcesso = cadprococor.idProcesso)) AS Ocorrencia2
            FROM cadprocesso, cadagen
            JOIN cadreu ON cadreu.idReu = cadprocesso.idReu
            JOIN cadcli ON cadcli.idCliente = cadprocesso.idCliente AND cadprocesso.idcliente = ‘001’
            WHERE (SELECT idProcOcor FROM cadprococor WHERE idprococor = (SELECT MAX(idprococor)FROM cadprococor WHERE cadprocesso.idProcesso = cadprococor.idProcesso)) ”
            AND (SELECT Ocorrencia1 FROM cadprococor WHERE idprococor = (SELECT MAX(idprococor)FROM cadprococor WHERE cadprocesso.idProcesso = cadprococor.idProcesso)) LIKE ‘%01/2010 %’
            AND ((SELECT idocorrencia FROM cadprococor WHERE idprococor = (SELECT MAX(idprococor) FROM cadprococor WHERE cadprocesso.idProcesso = cadprococor.idProcesso)) = cadagen.parametro1
            OR(SELECT idocorrencia FROM cadprococor WHERE idprococor = (SELECT MAX(idprococor) FROM cadprococor WHERE cadprocesso.idProcesso = cadprococor.idProcesso)) = cadagen.parametro2)

            #91939
            sancler
            Participante

              A idéia da cláusula WITH é fazer o select uma única vez e ficar com esses dados na memória. Seu select ficaria assim:

              WITH consultaRepetida AS
              (
              SELECT MAX (idprococor) maximo
              FROM cadprococor
              WHERE cadprocesso.idprocesso = cadprococor.idprocesso)

              SELECT cadprocesso.idprocesso, cadprocesso.processo, cadprocesso.nrovara,
              cadprocesso.vara, cadprocesso.idcliente, cadprocesso.idreu,
              cadprocesso.uf, cadprocesso.cidade, cadcli.razsoc, cadreu.nome,
              (SELECT idprococor
              FROM cadprococor
              WHERE idprococor = consultaRepetida.maximo) AS idprococor,

                 (SELECT idprocesso
                    FROM cadprococor
                   WHERE idprococor =consultaRepetida.maximo)  AS idprocesso,
              
                 (SELECT idocorrencia
                    FROM cadprococor
                   WHERE idprococor = consultaRepetida.maximo) AS idocorrencia,
              
                 (SELECT DATA
                    FROM cadprococor
                   WHERE idprococor = consultaRepetida.maximo) AS DATA,
              
                 (SELECT ocorrencia1
                    FROM cadprococor
                   WHERE idprococor = consultaRepetida.maximo) AS ocorrencia1,
              
                 (SELECT ocorrencia2
                    FROM cadprococor
                   WHERE idprococor = consultaRepetida.maximo) AS ocorrencia2
              

              FROM cadprocesso, cadagen JOIN cadreu ON cadreu.idreu = cadprocesso.idreu
              JOIN cadcli
              ON cadcli.idcliente = cadprocesso.idcliente
              AND cadprocesso.idcliente = '001'
              WHERE (SELECT idprococor
              FROM cadprococor
              WHERE idprococor = consultaRepetida.maximo) ''

              AND (SELECT ocorrencia1
              FROM cadprococor
              WHERE idprococor = consultaRepetida.maximo) LIKE '%01/2010 %'

              AND ( (SELECT idocorrencia
              FROM cadprococor
              WHERE idprococor = consultaRepetida.maximo)) = cadagen.parametro1
              OR (SELECT idocorrencia
              FROM cadprococor
              WHERE idprococor = consultaRepetida.maximo)) = cadagen.parametro2
              )

              OBS* desculpa se deixei passar alguma parentes, vírgula ou outra coisa.
              Mas acredito que a idéia foi passada, qualquer dúvida posta ai.

              #91943
              burga
              Participante

                Oi alvear, analisando sua consulta eu consegui cortar bastante coisa.
                Transformei todas as subquerys em uma só e joguei na cláusula from…
                Acho que ficou mais legível e deve melhorar um pouco a performance também.


                SELECT cadprocesso.idprocesso,
                cadprocesso.processo,
                cadprocesso.nrovara,
                cadprocesso.vara,
                cadprocesso.idcliente,
                cadprocesso.idreu,
                cadprocesso.uf,
                cadprocesso.cidade,
                cadcli.razsoc,
                cadreu.nome,
                ultimo.idprococor,
                ultimo.idprocesso,
                ultimo.idocorrencia,
                ultimo.data,
                ultimo.ocorrencia1,
                ultimo.ocorrencia2
                FROM cadprocesso,
                (SELECT idprococor,
                idprocesso,
                idocorrencia,
                data,
                ocorrencia1,
                ocorrencia2
                FROM cadprococor
                WHERE idprococor IN
                (SELECT MAX(idprococor)
                FROM cadprococor
                GROUP BY idprocesso)
                ) ultimo,
                cadagen JOIN cadreu ON cadreu.idreu = cadprocesso.idreu
                JOIN cadcli ON cadcli.idcliente = cadprocesso.idcliente AND cadprocesso.idcliente = '001'
                WHERE ultimo.idprocesso = cadprocesso.idprocesso
                AND ultimo.idprocor ''
                AND ultimo.ocorrencia1 LIKE '%01/2010 %'
                AND (ultimo.idocorrencia = cadagen.parametro1
                OR ultimo.idocorrencia = cadagen.parametro2);

                Não testei então pode dar algum erro bobo de sintaxe… qualquer coisa posta aqui…

                Se tiver testando no Oracle e não no MySQL, você ainda pode isolar a subquery dentro da clausula WITH como o Sancler já falou.

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