Oracle SQL динамический запрос с AND и OR более производительным - PullRequest
0 голосов
/ 27 января 2012

Есть ли лучший запрос для решения этой проблемы?

1 Автомобиль имеет много типов.

Я хочу что-то вроде этого: (ps это неверно, я знаю)

select * from car join type on car.id = type.id_car 
where type = 'SUV' 
and type = '4x4' 
and (type = 'blue' or type = 'red') 
and type = 'US' 
and (type = 'Manual' or type = 'Automatic' or 'SemiAutomatic') 
and type = 'diesel' and so on.

Мое решение:

select * from car 
where numberOfANDType = (select count(1) from Type where car.id = type.id_car and type in ('suv', '4x4', 'us', 'diesel')) 
and exists (select 1 from type where car.id = type.id_car and type in ('blue', 'red'))
and exists (select 1 from type where car.id = type.id_car and type in ('manual', 'automatic' or 'SemiAutomatic');

И т. Д.

пс: Я знаю число условий, используемых с ANDPS2: эти условия являются динамическими.

Anywayz: у меня есть для каждого типа столбца GROUP, и для типов, используемых в группах ИЛИ, у меня есть то же значение в этом столбце.Внедорожник имеет GROUP = 1, синий имеет GROUP = 2, красный имеет GROUP = 2 и так далее.Поэтому я делаю запрос к столбцу TYPE и счету в группе, чтобы увидеть, охвачены ли все группы.

Select id from car join type on .. where type in ('SUV', 'blue', 'red') group by id having count(distinct group) > 2;

Спасибо.

ps3: спасибо всем, ктоотклонил этот вопрос, вы очень добры.

Ответы [ 5 ]

2 голосов
/ 27 января 2012

Расширяя мой комментарий к ответу Космина, это должно сработать:

select car.id 
from car 
join type on car.id = type.id_car 
where type.type in 
('SUV','4x4','blue','red','US','Manual','Automatic','SemiAutomatic','diesel')
group by car.id
having count(distinct type.group)=6
2 голосов
/ 27 января 2012

Я думаю, что лучшим способом решения этой проблемы будет конкретизация типов и создание столбцов для них:

select * from car 
where type = 'SUV' 
and drive_type = '4x4' 
and (colour = 'blue' or colour = 'red') 
and origin = 'US' 
and (transmission = 'Manual' or transmission = 'Automatic') 
and fuel_type = 'diesel'

Затем вы можете использовать индексы для повышения производительности запроса.

0 голосов
/ 27 января 2012

У вас плохой дизайн.

Каждое значение группы должно входить в новый столбец.

Таким образом, таблица типов должна быть:

id_car color transmission fuel origin_country etc
1      blue  automatic    gas  UK
....

Запрос будет:

select * 
from car join type on (car.id = type.id_car)
where color in ('red', 'blue')
and transmision in ('automatic')
and country in ('US')
etc.
0 голосов
/ 27 января 2012
select * from car c1 where c1.id in
(
  select c.id from car c
  inner join Type t on c.id = t.id_car and c.type in ('suv', '4x4', 'us', 'diesel', 'blue', 'red', 'manual', 'automatic')
  group by c.id
  having count(distinct *) > 5
)
0 голосов
/ 27 января 2012

Это будет сделано:

select car.* 
from car INNER JOIN (
                     select id, count(*) countMatches
                     from car INNER JOIN type on car.id = type.id_car
                     where type in ('suv', '4x4', 'us', 'diesel','blue', 
                                    'red','manual', 'automatic')
                     group by id
                     having count(*) = 6
                    ) matches ON car.id = matches.id
...