Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pensa

Problemas com consulta SQL em sistema em ASP

Recommended Posts

Olá.. estou fazendo a manutenção de um sistema que fiz já faz 2 anos e que começo a rodar muito lento pois as querys SQL que usei na época não estão otimizadas, algumas dão select em toda a tabela de clientes para fazer comparações em cada cliente e mostrar só alguns na tela... como a base cresceu e agora conta com 2100 clientes, se o sistema continuar fazendo requisições enormes como essas a coisa toda vai se "arrastar" até não funcionar mais...

 

Seguinte... o banco tem as seguintes tabelas (vou resumir e mostrar só o que interessa):

 

CLIENTES

- ID_cliente

- nome

- prioridade (pode ser A, B ou C)

 

CONTATO

- ID_contato

- ID_cliente

- data

 

- Os funcionários da empresa regularmente entram em contato com os clientes e cadastram esses contatos na tabela de CONTATO com a data que foi feita a ligação.

 

- Cada cliente tem uma prioridade que pode ser A, B ou C. Clientes com prioridade A não podem ficar sem ser contatados por mais de 30 dias, clientes com prioridade B não podem ficar sem ser contatados por mais de 60 dias e clientes com prioridade C não podem ficar sem ser contatados por mais de 90 dias.

 

- Em certa página do sistema, quero exibir todos os clientes que estão com situação irregular, isto é, todos os clientes que passaram o prazo de contato e precisam ser contatados ou nunca foram contatados.

 

 

Do modo que estou fazendo atualmente eu dou um select em todos os clientes do BD (2100) e vou verificando um a um quais estão em situação irregular, os que estão eu mostro na tela, os que não, não mostro. SITUAÇÃO GRAVE E LAMENTÁVEL! :(

 

 

Eu queria encontrar um método de fazer a comparação direto na query SQL (com uma única query) e assim colocar nos recordsets apenas os clientes que procuro.

 

Alguém sabe me dizer como?

 

abraços e valeus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

da sim amigo .... dentro dos SELECTs você verifica se a prioridade for = A e a data gravada for 30 dias a menos do que a data atual dai você mostra senaum naum !!!!coloca alguma coisa semi pronta ai que dai a gente vai ajudando !!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

da sim amigo .... dentro dos SELECTs você verifica se a prioridade for = A e a data gravada for 30 dias a menos do que a data atual dai você mostra senaum naum !!!!

 

coloca alguma coisa semi pronta ai que dai a gente vai ajudando !!!

<{POST_SNAPBACK}>

Como exatamente? poderia me dar um exemplo da query SQL? Pois o que você me falou é a lógica (que eu já sei)... mas como a data do contato está em uma tabela e a prioridade em outra, não sei exatamente como construir esse SQL.

 

lembrando que um cliente pode ter vários contatos, então, o problema de se fazer um select na tabela de contatos é que a lista de clientes vai vir toda "redundante" cheio de duplicações...

 

Valeus!

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use a função DateDiff do Sql, vou dar um exemplo para os casos que a prioridade é A e não pode passar de 30 dias ok?

Select Clientes.nomeFrom Contato, ClientesWhere Clientes.ID_Cliente = Contato.ID_Cliente And Prioridade = 'A' And DateDiff('d',data,NOW()) < 30

Espero te ajudado,qualquer dúvida deixe um recado aqui que depois dou uma olhada.Abraços ;]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use a função DateDiff do Sql, vou dar um exemplo para os casos que a prioridade é A e não pode passar de 30 dias ok?

Select Clientes.nomeFrom Contato, ClientesWhere Clientes.ID_Cliente = Contato.ID_Cliente And Prioridade = 'A' And DateDiff('d',data,NOW()) < 30

Espero te ajudado,qualquer dúvida deixe um recado aqui que depois dou uma olhada.Abraços ;]

Entendi Faru.. Obrigado.. mas tem um problema... na tabela de contatos existe vários contatos com esse cliente, um deles pode ter acontecido a mais de 30 dias e outro somente a 15 dias... como faço pra query pegar somente o último contato feito com esse cliente... esse que é meu problema.deu pra entender?Valeu![]sRenan

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenta ai, acho q resolve teu problemaSelect distinct Clientes.nome From Contato, Clientes Where Clientes.ID_Cliente = Contato.ID_Cliente And Prioridade = 'A' And DateDiff(day,data,getdate()) > 30 and Clientes.id_cliente not in (Select distinct Clientes.id_cliente From Contato, Clientes Where Clientes.ID_Cliente = Contato.ID_Cliente And Prioridade = 'A' And DateDiff(day,data,getdate()) < 30)UNIONselect clientes.nome from clientes where id_cliente not in (select id_cliente from contato)

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenta ai, acho q resolve teu problemaSelect distinct Clientes.nome From Contato, Clientes Where Clientes.ID_Cliente = Contato.ID_Cliente And Prioridade = 'A' And DateDiff(day,data,getdate()) > 30 and Clientes.id_cliente not in (Select distinct Clientes.id_cliente From Contato, Clientes Where Clientes.ID_Cliente = Contato.ID_Cliente And Prioridade = 'A' And DateDiff(day,data,getdate()) < 30)UNIONselect clientes.nome from clientes where id_cliente not in (select id_cliente from contato)

Não deu certo.. acontece esse erro:Microsoft JET Database Engine erro '80040e14' O número de colunas nas duas tabelas ou consultas selecionadas de uma consulta união não coincidem. E como eu não entendi a lógica dessa query não sei alterar pra tentar fazer dar certo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.