Ir para conteúdo

POWERED BY:

Arquivado

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

edlyra

Select não considera a segunda parte da condição

Recommended Posts

Saudações a todos,

 

Bem pessoal esbarrei com um problema estranho e não estou conseguindo resolver, é o seguinte:

 

A query abaixo esta ignorando a segunda parte da condição (depois do and). Fazendo uns testes malucos notei que se substituo o inner join na primeira parte da condição por left join ela passa a funcionar perfeitamente. Alguém saberia dizer porque isso acontece, estou usando o Firebird 2.1.3.18185.

 

O objetivo da query é filtrar todos os alunos em dia com a mensalidade em uma determinada data (09/11/2010) que não tem acessos desde 17/08/2010.

 

Select * from ALUNOS Alu where

 

(Alu.ID in (Select CxMens.ID_ALUNO from CAIXA_MENSALIDADES CxMens

inner join CAIXA Cx on (Cx.CODIGO = CxMens.COD_CAIXA)

where Cx.ESTORNO = "N" and "09/11/2010" between CxMens.PERIODO_VIGENCIA_INI and CxMens.PERIODO_VIGENCIA_FIN))

 

and

 

(Alu.ID not in (Select Aces.ID_ALUNO from ACESSOS Aces where Aces.DATA >= "08/17/2010"))

Compartilhar este post


Link para o post
Compartilhar em outros sites

Execute as queries em separado e veja se cada uma trás o resultado esperado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezados Prog e Motta,

 

Fiz vários testes e, inclusive por sugestão de outro amigo passei a usar um Cast no between.

 

Motta, já executei as duas partes da query separadamente e cada uma faz exatamente o que é esperado.

 

Abaixo estou enviando uns exemplos de testes que fiz.

 

Teste 1 (não funciona):

-----------------------

 

Select * from ALUNOS Alu where

 

(Alu.ID in (Select CxMens.ID_ALUNO from CAIXA_MENSALIDADES CxMens

inner join CAIXA Cx on (Cx.CODIGO = CxMens.COD_CAIXA)

where Cx.ESTORNO = "N" and Cast("09/11/2010" as Date) between CxMens.PERIODO_VIGENCIA_INI and CxMens.PERIODO_VIGENCIA_FIN))

 

and

 

(Alu.ID not in (Select Aces.ID_ALUNO from ACESSOS Aces where Aces.DATA >= "08/17/2010"))

 

 

Teste 2 (funciona):

-------------------

 

Select * from ALUNOS Alu where

 

(Alu.ID in (Select CxMens.ID_ALUNO from CAIXA_MENSALIDADES CxMens

LEFT join CAIXA Cx on (Cx.CODIGO = CxMens.COD_CAIXA)

where Cx.ESTORNO = "N" and Cast("09/11/2010" as Date) between CxMens.PERIODO_VIGENCIA_INI and CxMens.PERIODO_VIGENCIA_FIN))

 

and

 

(Alu.ID not in (Select Aces.ID_ALUNO from ACESSOS Aces where Aces.DATA >= "08/17/2010"))

 

 

Teste 3 (funciona):

-------------------

 

Select * from ALUNOS Alu where

 

Alu.ID in (Select CxMens.ID_ALUNO from CAIXA_MENSALIDADES CxMens

inner join CAIXA Cx on (Cx.CODIGO = CxMens.COD_CAIXA)

where Cx.ESTORNO = "N" and Cast("09/11/2010" as Date) between CxMens.PERIODO_VIGENCIA_INI and CxMens.PERIODO_VIGENCIA_FIN

and Alu.ID not in (Select Aces.ID_ALUNO from ACESSOS Aces where Aces.DATA >= "08/17/2010"))

 

 

O que me parece é que o join não está sendo interpretado na hora certa.

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.