USAR WHERE, AND E OR NA MESMA CONSULTA, USAR WHERE, AND E OR NA MESMA CONSULTA
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?
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
Curtidas 0
Respostas
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
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.
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
05/06/2012
Vc testou somente o 3º select?
Do mesmo jeito que está postado...
Do mesmo jeito que está postado...
GOSTEI 0
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))) )
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
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.
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
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))
(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
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.
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
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.
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
05/06/2012
Pessoal obrigado pela ajuda, problema resolvido.
GOSTEI 0
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)
)
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