USAR WHERE, AND E OR NA MESMA CONSULTA, USAR WHERE, AND E OR NA MESMA CONSULTA

Firebird

05/06/2012

Boa tarde pessoal, fiz uma consulta que é a seguinte:

select * from venda v
where V.MAPA IS NULL
and v.cancelado is null
and (v.cidade not in (53,54,28,8,18,22,27,110,101,111)
or v.venda in
(
select v1.venda
from venda v1
where v1.cidade in (1,2,21,41) and
V1.DATDOC >= (SELECT CURRENT_DATE FROM RDB$DATABASE)))

Vou explicar a hierarquia do que preciso de retorno da consulta abaixo:

(primeira parte: quero todas as vendas que não estão em mapa nenhum e não estejam canceladas)
select * from venda v where V.MAPA IS NULL and v.cancelado is null

(segunda parte: trazer as vendas das cidades que não sejam das cidades que coloquei no not in )
and (v. not in (53,54,28,8,18,22,27,110,101,111)

(terceira parte: dessas vendas que retornaram quero retirar as que são de outros dias que não o dia de hoje, tipo o que vende na cidade (1,2,21,41) ontem já não me interessa por isso usei o CURRENT_DATE FROM RDB$DATABASE, interessa apenas as vendas da data de hoje que seria a data do banco-firebird)
or v.venda in (select v1.venda from venda v1 where v1.cidade in (1,2,21,41) and V1.DATDOC >= (SELECT CURRENT_DATE FROM RDB$DATABASE)))

Mas de qualquer forma que eu faça, colocando ou retirando os parenteses o retorno é sempre o mesmo, sempre vem as vendas das cidades que preciso retirar da consulta usando o OR, sendo que pelo meu entender o que coloquei após o OR deveria não vir na consulta, alguma ideia?
Waister Marques

Waister Marques

Curtidas 0

Respostas

William

William

05/06/2012

Colega pode até parecer uma idéia idiota, mas quando tenho que montar um select muito grande com várias condições e sub-selects, começo fatiando o select e vou montando aos poucos, desse modo consigo pegar qual condição está dando erro.
GOSTEI 0
Waister Marques

Waister Marques

05/06/2012

Bom dia.
Fiz dessa forma, mas a duvida é em relação o porque a minha terceira parte não esta retornando o resultado desejado.
GOSTEI 0
William

William

05/06/2012

Vc testou somente o 3º select?

Do mesmo jeito que está postado...
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

05/06/2012

Waister, tente colocar entre parentese as duas condições da cidade, como no exemplo abaixo!

select *
from venda v
where (v.mapa is null)
and (v.cancelado is null)
and ( (v.cidade not in (53,54,28,8,18,22,27,110,101,111)
or v.venda in (select v1.venda
from venda v1
where v1.cidade in (1,
2,
21,
41)
and v1.datdoc >= (select current_date
from rdb$database))) )
GOSTEI 0
Waister Marques

Waister Marques

05/06/2012

Bom dia Bretas.
select *
from venda v
where (V.MAPA IS NULL)
and (v.cancelado is null)
and ((v.operacao not in (53,54,28,8,18,22,27,110,101,111)
or v.venda in
(
select v1.venda
from venda v1
where v1.operacao in (1,2,21,41)
and V1.DATDOC >= (SELECT CURRENT_DATE FROM RDB$DATABASE)
)))
Já havia feito essa tentativa, mas do mesmo jeito o retorno da consulta esta trazendo todas as vendas das cidades 1,2,21,41 e não apenas as feitas hoje, por algum motivo ele não esta entendendo que quero apenas as vendas de hoje em relação as cidades 1,2,21,41.
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

05/06/2012

Waister, ele não esta trazendo somente as vendas do dia pq é vc diz na primeira condição
(v.cidade not in (53,54,28,8,18,22,27,110,101,111)

Por que o campo cidade esta dividido em dois?

O que vc quer não seria isso:

select *
from venda v
where (v.mapa is null)
and (v.cancelado is null)
and (v.cidade not in (53,54,28,8,18,22,27,110,101,111, 1,2,21,41)
and (v.datdoc >= (select current_date from rdb$database))
GOSTEI 0
Waister Marques

Waister Marques

05/06/2012

Bretas

select *
from venda v
where (V.MAPA IS NULL)
and (v.cancelado is null)
and ((v.operacao not in (53,54,28,8,18,22,27,110,101,111,1,2,21,41)
or v.venda in (select v1.venda from venda v1 where v1.operacao in (1,2,21,41)
and V1.DATDOC >= (SELECT CURRENT_DATE FROM RDB$DATABASE))))

Essa acho que funciona.
GOSTEI 0
Waister Marques

Waister Marques

05/06/2012

Bretas

select *
from venda v
where (V.MAPA IS NULL)
and (v.cancelado is null)
and ((v.operacao not in (53,54,28,8,18,22,27,110,101,111,1,2,21,41)
or v.venda in (select v1.venda from venda v1 where v1.operacao in (1,2,21,41)
and V1.DATDOC >= (SELECT CURRENT_DATE FROM RDB$DATABASE))))

Essa acho que funciona.
GOSTEI 0
Waister Marques

Waister Marques

05/06/2012

Pessoal obrigado pela ajuda, problema resolvido.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

05/06/2012

não precisa dessa subselect. ela só vai consumir recursos da máquina e piorar a performance da consulta.

tente assim:

select *
from venda
where mapa is null
and cancelado is null
and
(
v.operacao not in (53,54,28,8,18,22,27,110,101,111,1,2,21,41)
or
(v.operacao in (1,2,21,41) and v.datdoc >= CURRENT_DATE)
)
GOSTEI 0
POSTAR