2012-01-27 3 views
0

이 문제를 해결하기위한 더 나은 쿼리가 있습니까?OR 및 OR이 더 많은 Oracle SQL 동적 쿼리

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'); 

등등

나는 이런 식으로 뭔가를 할 수 있습니다.

ps : AND
ps2와 함께 사용되는 조건의 수를 알고 있습니다. 이러한 조건은 동적입니다.

Anywayz : 각 유형에 대해 GROUP 열이 있고 OR 그룹에 사용 된 유형에 대해이 열에 같은 값이 있습니다. SUV에는 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 :이 질문에 답한 사람 덕분에, 당신은 매우 친절합니다.

+0

당신을 가지고 이 쿼리가 좋지 않은지 확인하기 위해 계획을 사용 했습니까? 실수가 아니라면, 오라클은 사용할 때 당신의 타입 FK를 사용하여 차 PK를 가리킬 것입니다. –

+0

당신이 얻으려고하는 것은 분명하지 않습니다 - 모든 유형의 모든 차량, 모든 유형의 차량,이 유형을 제외한 모든 차량,이 유형 중 일부가 있지만 다른 것은없는 모든 차량을 반환하고 싶습니까? 또는 무엇을? –

+0

모든 AND 유형과 OR 그룹 중 하나 이상을 가진 모든 자동차. 당신은 어떤 수의 AND 유형이나 OR 그룹을 가질 수 있으며, OR 그룹 내에는 몇 가지 유형을 가질 수 있습니다. –

답변

2

코스 민의 대답에 내 의견에 확장이 작동합니다 :

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 
+0

그것은 작동하지 않습니다. OR 그룹의 유형이 AND로 단일 유형을 포함하지 않도록 개수를 늘릴 수 있기 때문입니다. –

+0

@CosminVacariou :'or' 절은 각각 하나의 type.group 값에 대한 것입니다. colors는 모두 group 2입니다.이 having 절은 type.group의 ** distinct ** 값에 있습니다. 그래서 몇 개의 색상이 지정/선택 되더라도 일치하는 색상의 수에 관계없이 카운트는 1 씩 증가합니다 가 선택됩니다. –

+0

예. IN은 그룹 열을 기반으로하지 않습니다. 그룹에 있다면 괜찮아요. :) –

0

이 그것을 할 것입니다 :

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' 

이 그럼 당신은 사용할 수 있습니다

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 
+0

그것은 8이 아니며> 5 –

+0

> 5가 여전히 올바르지 않습니다. 사촌 5 ORed 항목의 단일 그룹에서 5 가질 수 있습니다. –

+0

@aF : Doh, thanks, updated. @ Cosmin : 귀하가 제공 한 정보를 기반으로, 이것은 당신이 원하는 것을해야합니다. 귀하의 질문은 그룹에 대해 언급하지 않으며 데이터 구조를 설명하지도 않습니다. 확실한 답을 원하면 질문에 관련된 모든 정보를 제공해야합니다. – StevieG

2

을 나는이 문제를 해결하는 더 좋은 방법은 유형에 대한 구체적 이들에 대한 열을 만들 수있을 거라고 생각 인덱스를 사용하여 쿼리의 성능을 향상시킵니다.

0
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

ps * –

0

잘못된 디자인입니다.

모든 그룹 값이 새 열로 이동합니다.

그래서 유형 테이블이 있어야한다 :

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

예와 별개로 사용할 수는 없지만 그렇지 않습니다. –

+0

내 예제가 좋지 않습니다. 실제 디자인은 내 응용 프로그램에서 괜찮습니다. –

+0

그것은 ipothetical 경우인가요? 좋습니다,이 상황에서 당신은 이상을 유지할 수 있습니다. 이 디자인은 약한 EAV는 문제가 발생할 것입니다 :) –