[firebase-br] SQL

André Conrado acf em andreconrado.net
Qui Maio 24 17:58:34 -03 2012


se vai usar JOIN então não vai precisar dos SUBSELECT. Simplifique
para ficar mais rápido:

SELECT DISTINCT Clientes.IDCliente
FROM (Clientes LEFT JOIN Pedidos ON
Pedidos.IDCliente=Clientes.IDCliente)  LEFT JOIN Promocoes ON
Promocoes.IDCliente=Clientes.IDCliente
WHERE (Clientes.DTAtualizacao BETWEEN :DATA1 AND :DATA2) OR
(Pedidos.DTPedido BETWEEN :DATA1 AND :DATA2) OR (Promocoes.DTPromocao
BETWEEN :DATA1 AND :DATA2)

obs. A cláusula DISTINCT irá remover as duplicidades.

Vê se assim melhora.

Abçs


Em 24 de maio de 2012 17:43, Paulo <pcesardias em gmail.com> escreveu:
> Muito obrigado, fiz algumas alterações e com os testes que fiz tá ok. Vou fazer mais um montão de testes mas acho que é isso mesmo.
> Estou passando abaixo o que fiz, não sei se há outra forma melhor de fazer, se você souber e puder dar mais uma ajuda, eu agradeço.
>
> Ficou mais ou menos assim:
>
>
> SELECT Clientes.IDCliente
> FROM Clientes
>        INNER JOIN PEDIDOS ON (Pedidos.IDCliente=Clientes.IDCliente)
>        /*
>         Aqui também somente o último pedido, não sei se é a melhor forma fazer isso no join, mas é como está funcionando aqui
>        */
>        AND  (Pedidos.IDPedido=(SELECT MAX(IDPedido) FROM Pedidos WHERE(IDCliente=Clientes.IDCliente)))
>
> WHERE (EXISTS(SELECT Pedidos.IDCliente FROM Pedidos
>            WHERE Pedidos.DTPedido BETWEEN :DATA1 AND :DATA2
>            AND   Pedidos.IDCliente = Clientes.IDCliente))
>
>   or (EXISTS(SELECT Promocoes.IDCliente FROM Promocoes
>            WHERE Promocoes.DTPromocao BETWEEN :DATA1 AND :DATA2
>            AND   Promocoes.IDCliente = Clientes.IDCliente
>           AND (Promocoes.IDPROMOCAO=(SELECT MAX(IDPROMOCAO) FROM Promocoes WHERE(IDCliente=Promocoes.IDCliente)))
>        /*
>         Última promoção do CLIENTE
>        */
>
>
>
> Muito obrigado pela sua ajuda e a todos que sempre quebram o galho de quem precisa!!!
>
>
>
> Paulo
>
>
> Em 24/05/2012, às 16:18, Matheus(GMAIL) escreveu:
>
>> Seria o que eu passei e para você obter os dados dai de qual faça um sub
>> select para cada um que irá resolver.
>>
>> Ali tu vai ter só os clientes que tem alguma promoção ou pedido...
>>
>> -----Original Message-----
>> From: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br]
>> On Behalf Of Paulo
>> Sent: quinta-feira, 24 de maio de 2012 16:20
>> To: FireBase
>> Subject: Re: [firebase-br] SQL
>>
>> Olá!
>>
>>
>> Na realidade preciso dos dados do cliente e do último pedido e os mesmo
>> dados se ele não fez pedido não teve os dados atualizados mas participou de
>> uma promoção, tudo com base no intervalo de datas.
>>
>> Se os dados foram atualizados e/ou fez algum pedido e/ou participou de
>> promoção eu seleciono o cliente.
>>
>> Já tentei com inner join, left join etc., max() para pegar o último
>> pedido/promoção mas sempre tenho duplicidade.
>>
>>
>> obrigado,
>>
>> Paulo
>>
>> Em 24/05/2012, às 16:02, Wilson Rosa escreveu:
>>
>>> Paulo,
>>>
>>> Quando você diz *"todos os dados de cada cliente"*, você quer dizer todos
>>> os pedidos e todas as promoções no intervalo de datas?
>>>
>>> Quando você diz *"Preciso selecionar um cliente e somente um"* você quer
>>> dizer que irá informar o código do cliente a ser pesquisado, ou
>>> independente de quantos clientes estiverem no intervalo de datas é pra
>>> trazer somente um cliente (o primeiro)?
>>>
>>>
>>> *Wilson Rosa*
>>> Desenvolvedor Desk
>>> *wsrosa em gmail.com
>>> *
>>> *
>>> *
>>>
>>>
>>>
>>> Em 24 de maio de 2012 15:38, Paulo <pcesardias em gmail.com> escreveu:
>>>
>>>> Boa tarde a todos!
>>>>
>>>> Possuo tres tabelas e estou tendo dificuldade pra extrair os dados como
>>>> quero.
>>>>
>>>> 1) Clientes
>>>>      IDCliente                       1
>>>>      DTAtualizacao           1/5/2012
>>>>
>>>> 2) Pedidos
>>>>      IDCliente                       1
>>>>      DTPedido                        3/5/2012
>>>>
>>>> 3) Promocoes
>>>>      IDCliente                       1
>>>>      DTPromocao              3/5/2012
>>>>
>>>> Preciso selecionar um cliente e somente um se ao menos uma das datas
>>>> estiver dentro de um intervalo que será passado. Já tentei um monte de
>>>> coisas e não consegui.
>>>>
>>>> Exemplo:  Se eu passar o intervalo de 1/5/2012 até 24/5/2012, listo todos
>>>> os dados de cada cliente que possua uma das datas dentro deste.
>>>>
>>>> Será que alguém pode dar uma ajuda?
>>>>
>>>>
>>>> Obrigado,
>>>>
>>>> Pauloß
>>>> ______________________________________________
>>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>>
>>> ______________________________________________
>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa




Mais detalhes sobre a lista de discussão lista