- Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 2 meses atrás por
burga.
-
AutorPosts
-
7 de janeiro de 2010 às 5:43 pm #91891
alvear
ParticipanteBom 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!7 de janeiro de 2010 às 9:12 pm #91908burga
ParticipanteSe 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.
7 de janeiro de 2010 às 11:21 pm #91932sancler
ParticipanteComo 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!
7 de janeiro de 2010 às 11:40 pm #91936alvear
ParticipanteEsse 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)8 de janeiro de 2010 às 12:12 am #91939sancler
ParticipanteA 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 ocorrencia2FROM 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.8 de janeiro de 2010 às 3:39 am #91943burga
ParticipanteOi 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.
-
AutorPosts
- Você deve fazer login para responder a este tópico.