Ir para conteúdo

POWERED BY:

Arquivado

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

Ghean

Consulta em regras com AND e OR

Recommended Posts

Tenho uma base com cadastro de veiculos e opcionais.

 

VEICULOS

id_veiculo

 

OPCIONAIS

id_opcional

 

Possuo uma tabela com relação dos opcionais para cada veiculo.

 

OPCIONAIS_VEICULOS

id_opcional

id_veiculo

 

Possuo também um tabela (OPTION_BUILD) onde é informado os opcionais que aquele veiculo deve ter.

 

OPTION_BUILD

vehicle_id

option_rule

 

A tabela OPTION_BUILD não foi criada por mim, é uma base de um sistema da inglaterra que fazemos um integração.

Não consegui nenhum suporte com a empresa de como é feita essa consulta.

 

Nessa tabela tenho o seguinte resultado:

 

veicle_id 7734500

option_rule {7566} AND ({7456} OR {1234} OR {4321})

 

 

Ou seja para o veiculo 7734500 tenho que ter o opcional 7566 e qualquer outro opcional entre 7456, 1234 e 4321.

 

Como posso fazer uma consulta na tabela OPCIONAIS_VEICULOS seguindo essa regra?

 

Seria algo do tipo

 

SELECT * FROM OPCIONAIS_VEICULOS WHERE id_veiculo = 7734500 AND id_opcional = 7566 AND (id_opcional = 7456 OR id_opcional =1234 OR id_opcional =4321)

 

Mas esse tipo de consulta não funciona.

 

Existe alguma função ou procedure para realizar esse tipo de consulta?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use in

 

SELECT * FROM OPCIONAIS_VEICULOS WHERE id_veiculo = 7734500 AND id_opcional in (7566,7456,4321)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use in

 

SELECT * FROM OPCIONAIS_VEICULOS WHERE id_veiculo = 7734500 AND id_opcional in (7566,7456,4321)

 

Certo... mas nesse caso eu preciso ter um opcional "E" um desses outros, entendeu?

Usaria esse tipo de consulta quando o retorno de option_rule fosse

 

{1234} OR {4321} OR {1235}

 

 

Segue um exemplo de como seria a descrição dessa da regra que preciso

 

Requer:

Sensor de Estacionamento

E

Kit AD

Ou

Kit A

Ou

Kit B

 

grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

VEICULOS

id_veiculo

 

OPCIONAIS

id_opcional

 

Possuo uma tabela com relação dos opcionais para cada veiculo.

 

OPCIONAIS_VEICULOS

id_opcional

id_veiculo

 

select *
from VEICULOS
where exists (select null
             from   OPCIONAIS_VEICULOS
             where  OPCIONAIS_VEICULOS.id_veiculo = VEICULOS.id_veiculo 
             and    OPCIONAIS_VEICULOS.id_opcional = 7566)
and    exists (select null
              from   OPCIONAIS_VEICULOS
              where  OPCIONAIS_VEICULOS.id_veiculo = VEICULOS.id_veiculo 
              and    OPCIONAIS_VEICULOS.id_opcional in (7456, 1234 e 4321))

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dessa forma deu certo.

 

Mas ainda tenho algumas dúvidas...

 

como posso fazer essa consulta de forma dinamica?

 

e como ajustar em diferentes tipos de regras, já que terei varias regras

 

({1259} OR {1256}) AND ({1241} OR {1240})

 

{1259} AND {1256} AND ({1241} OR {1240})

Compartilhar este post


Link para o post
Compartilhar em outros sites

Monte a query dinamicamente

 

select *
from VEICULOS
where 
     <exists> <not exists>
            (select null
             from   OPCIONAIS_VEICULOS
             where  OPCIONAIS_VEICULOS.id_veiculo = VEICULOS.id_veiculo 
             and    OPCIONAIS_VEICULOS.id_opcional = <param1>)

<and> <or>
      <exists> <not exists>
            (select null
             from   OPCIONAIS_VEICULOS
             where  OPCIONAIS_VEICULOS.id_veiculo = VEICULOS.id_veiculo 
             and    OPCIONAIS_VEICULOS.id_opcional = <param2>)

...

<and> <or>
      <exists> <not exists>
            (select null
             from   OPCIONAIS_VEICULOS
             where  OPCIONAIS_VEICULOS.id_veiculo = VEICULOS.id_veiculo 
             and    OPCIONAIS_VEICULOS.id_opcional = <paramN>)

 

Tenha cuidado com os parenteses devido ao AND e OR na mesma sentença.

 

Não deve ficar rápido, mas deve responder.

 

Tem a vantagem de poder responder quem não tem o opcional X por exemplo.

 

Por hora não me ocorre solução melhor, deve existir porém.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi.

 

Irei fazer alguns testes e caso tenha novas dúvidas postarei.

 

Obrigado pela ajuda...

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.