Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
>
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.
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))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})
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.
Entendi.
Irei fazer alguns testes e caso tenha novas dúvidas postarei.
Obrigado pela ajuda...
Use in
SELECT * FROM OPCIONAIS_VEICULOS WHERE id_veiculo = 7734500 AND id_opcional in (7566,7456,4321)