|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Ter Abr 03, 2018 3:46 pm Assunto: Consulta SQL com registros repetidos |
|
|
Boa tarde amigos,
Tenho a seguinte consulta SQL abaixo que funciona bem:
Código: | select p.numpro,
p.varapro,
p.numcon,
c.nomcon,
p.numuni,
p.dtinipro,
p.situpro,
p.reupro,
p.obspro,
p.reuautorpro,
max(a.dtand) dtultand
from Juridico.dbo.Jprocessos p
inner join Juridico.dbo.Jcondominios c on p.numcon = c.numcon
inner join Juridico.dbo.Jandamentos a on p.numpro = a.numpro
group by p.numpro,
p.varapro,
p.numcon,
c.nomcon,
p.numuni,
p.dtinipro,
p.situpro,
p.reupro,
p.obspro,
p.reuautorpro |
Existem vários andamentos vinculados ao mesmo processo.
Atualmente estou mostrando a data do andamento mais recente vinculado ao processo (max(a.dtand) dtultand).
Estou precisando adicionar também o campo desand (Descrição do andamento) do andamento mais recente vinculado ao processo no retorno do sql.
Já tentei acrescentar este campo e o resultado está vindo com os registros repetidos. Tentei fazer com Max e não repete mas traz o ultimo registro em ordem alfabetica.
Resumindo, eu preciso listar no processo os campos dtand e desand somente do Andamento mais recente.
Desde já agradeço a atenção. _________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin
Editado pela última vez por natanbh1 em Qui Jun 07, 2018 10:25 am, num total de 4 vezes |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
|
Voltar ao Topo |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Ter Abr 03, 2018 4:50 pm Assunto: |
|
|
Boa tarde Imex,
Utilizo aqui o SQL Server 2008 R2.
Sim, pode haver registros com a mesma data. Neste caso o critério será a data e hora.
Este campo é Datetime e armazena a data/hora no formato yyyy-mm-dd hh:mm:ss.zzz. _________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Abr 03, 2018 5:16 pm Assunto: |
|
|
Experimente fazer uns testes dessa forma:
Código: | with CTE_RN as
(
select
p.numpro,
p.varapro,
p.numcon,
c.nomcon,
p.numuni,
p.dtinipro,
p.situpro,
p.reupro,
p.obspro,
p.reuautorpro,
a.dtand,
a.desand,
row_number() over(partition by p.numpro order by a.dtand desc) as rn
from Juridico.dbo.Jprocessos p
inner join Juridico.dbo.Jcondominios c on p.numcon = c.numcon
inner join Juridico.dbo.Jandamentos a on p.numpro = a.numpro
)
select * from CTE_RN
where rn = 1 |
Espero que ajude |
|
Voltar ao Topo |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qua Abr 04, 2018 12:29 pm Assunto: |
|
|
Funcionou perfeitamente. Muito obrigado. _________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Seg Mai 28, 2018 5:26 pm Assunto: |
|
|
Boa tarde Imex,
Estou reabrindo o tópico, porque surgiu um problema.
Adaptei o código SQL que você passou e funcionou perfeitamente no SQL Server:
Código: | with CTE_RN as
(select
p.numpro,
p.varapro,
p.numcon,
c.nomcon,
c.codger,
p.numuni,
p.dtinipro,
p.situpro,
p.reupro,
p.obspro,
p.reuautorpro,
a.dtincand,
a.desand,
a.informand,
row_number() over(partition by p.numpro order by a.dtincand desc) as rn
from Juridico.Jprocessos p
inner join Juridico.Jcondominios c on p.numcon = c.numcon
left join Juridico.Jandamentos a on p.numpro = a.numpro and informand = 'EXTERNO')
select * from CTE_RN
where rn = 1 and numcon = :numcon order by numcon |
O problema é que a empresa que trabalho resolveu migrar para o banco MariaDB (MySQL) e a consulta acima até funciona mas demora demais.
No SQL Server demora 2 a 3 segundos já no MariaDB demora 2 a 3 minutos...
Existe alguma maneira de deixar a consulta mais rápida ou outro código SQL que faça o mesmo trabalho e seja mais rápido?
Obrigado.
Citação: | Banco de Dados: MariaDB (MySQL)
Componentes BD: Zeos |
_________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Mai 29, 2018 10:04 am Assunto: |
|
|
Bom dia,
Não tenho nenhuma experiência com o MariaDB (MySQL), mas acho essa diferença no desempenho talvez esteja ocorrendo porque o SQL Server estaria conseguindo fazer alguma otimização na consulta antes da execução.
Experimente fazer uns testes da forma abaixo, antecipando um dos filtros e postergando um dos Joins:
Código: | with CTE_RN as
(
select
p.numpro,
p.varapro,
p.numcon,
p.numuni,
p.dtinipro,
p.situpro,
p.reupro,
p.obspro,
p.reuautorpro,
a.dtincand,
a.desand,
a.informand,
row_number() over(partition by p.numpro order by a.dtincand desc) as rn
from Juridico.Jprocessos p
left join Juridico.Jandamentos a on p.numpro = a.numpro and informand = 'EXTERNO'
where
p.numcon = :numcon
)
select
r.*,
c.nomcon,
c.codger
from CTE_RN as r
inner join Juridico.Jcondominios c on r.numcon = c.numcon
where
r.rn = 1
order by
numcon |
Espero que ajude |
|
Voltar ao Topo |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Ter Mai 29, 2018 3:18 pm Assunto: |
|
|
Excelente, Imex! A consulta ficou rápida como no SQL Server.
Muito obrigado novamente. _________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qui Jun 07, 2018 10:24 am Assunto: |
|
|
Reabrindo o tópico novamente rsrs...
Uso este SQL em uma consulta em que o usuário pode escolher por qual campo será efetuado o filtro.
Se o filtro é feito pelos campos de dentro da CTE, a pesquisa funciona rápidamente (1 segundo ou menos).
Se o filtro é feito por qualquer campo de fora da CTE (tabela JCondomios), a pesquisa demora (cerca de 90 segundos) travando a aplicação neste tempo.
Exemplo de consulta demorada:
Código: | with CTE_RN as
(
select p.numpro,
p.varapro,
p.numcon,
p.numuni,
p.dtinipro,
p.situpro,
p.reupro,
p.obspro,
p.reuautorpro,
a.dtincand,
a.desand,
a.informand,
row_number() over(partition by p.numpro order by a.dtincand desc) as rn
from Jprocessos p
left join Jandamentos a on p.numpro = a.numpro and informand = 'EXTERNO'
)
select
r.*,
c.nomcon,
c.codger
from CTE_RN as r
inner join Jcondominios c on r.numcon = c.numcon
where r.rn = 1 and c.codger = :codger
order by numcon |
Qualquer ajuda para reduzir este tempo de consulta será muito bem vinda.
Obrigado. _________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Jun 07, 2018 11:18 am Assunto: |
|
|
Acho que nesse caso vale a pena fazer uns testes deixando o Join com a tabela Jcondominios dentro da CTE para poder fazer o filtro (no exemplo pelo campo c.codger) também dentro dela.
Espero que ajude |
|
Voltar ao Topo |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|