2017-11-28 3 views
0

나는 공급 업체, 판매 업체 및 위치와 관련된 데이터베이스를 보유하고 있습니다.WHERE 조건과 HAVING 조건 모두에서 OR 연산자 사용

특정 수의 제품을 판매하는 공급 업체의 경우 특정 지역 (예 : 또는)을 기반으로하는 공급 업체를 검색해야합니다.

이 질문의 예는 다음과 같습니다 하나 개 이상의 항목을 제공 할 수 있습니다 또는 일리노이 주에 본사를 둔 모든 업체의 전체 이름은 무엇

입니까?

두 개의 SQL 쿼리를 사용할 수 있으면이 작업은 간단합니다 (그러나이 문제는 해결할 수 없습니다). ORA-00933 : SQL 명령이 제대로

만약을 종료되지 아니, 사용되는 테이블 간의 조인을 내 솔루션은 잘못하지만 제가 1 호선에서

select 
cs.vendor_id, name, count(cs.PRODUCT_ID) 
from 
grocery.vendor 
where 
va.state_territory_province = 'Illinois' 
group by 
(cs.vendor_id) 
or /# error found here #/ 
having 
(count(cs.product_id)>1); 

오류를 시도 무엇인가가없는 가정

나는 Illonois를 사용하여 이러한 결과

을 얻을 별도로 각 하나를 시도

select 
cs.vendor_id, v.name, count(cs.PRODUCT_ID) 
from 
grocery.vendor v 
inner join grocery.vendor_address va 
on (v.vendor_id = va.vendor_id) 
inner join grocery.can_supply cs 
on (v.vendor_id = cs.vendor_id) 
where 
va.state_territory_province = 'Illinois' 
group by 
(cs.vendor_id, v.name); 

VENDOR_ID 이름의 COUNT (CS.PRODUCT_ID)


33 Drinks R Us      1 
35 Jungle Man      1 
34 Poland Spring      1 

제품

select 
cs.vendor_id, v.name, count(cs.PRODUCT_ID) 
from grocery.vendor v 
inner join grocery.vendor_address va 
on (v.vendor_id = va.vendor_id) 
inner join grocery.can_supply cs 
on (v.vendor_id = cs.vendor_id) 
group by (cs.vendor_id, v.name) 
having(
count(cs.product_ID)>1); 

VENDOR_ID 이름의 COUNT의 수 (CS.PRODUCT_ID)를 사용하여


8 Orgo Home Farm     3 
17 Wellness       2 
21 Wily Wonka      4 
27 Camel        3 
29 Supplies R Us      5 
13 Clean Me Please     5 
15 Oral Care Inc      2 
31 Cheese Cake Factory    2 
37 Crunchy       2 
1 Moo Moo Milk Farm     4 
4 Haagen Daz      3 
26 Beer Inc       4 
6 Sailor Bob      3 
10 Dawn        2 
16 SPAM        2 
18 Wonder inc      3 
5 Butcher Mat      3 
9 Soda Forever      4 
14 Wash Shampoo Inc     4 
24 Huntz        4 
20 Hershey       3 
22 Bake Me Inc      5 
30 We Make Pizza      2 
36 Taste Treat      3 
7 Monkey Paradise     6 
19 Puff        5 

26 개의 행이 선택되었습니다.

기본적으로이 두 쿼리를 하나로 병합하고 싶습니다.

+0

용어 : '또는'은 절이 아닌 연산자입니다. 'where'와'having'은 절이 아니라 진술이 아닙니다. – mathguy

+0

고맙습니다. 정의는 매우 중요합니다. 그건 내 실수 였어. –

답변

0

당신은 HAVING 절에 두 조건을 넣을 수 있어야한다 : 의견에서 지적

select v.vendor_id, 
     v.name, 
     count(cs.PRODUCT_ID) 
    from grocery.vendor v 
    join grocery.vendor_address va 
    on v.vendor_id = va.vendor_id 
    join grocery.can_supply cs 
    on v.vendor_id = cs.vendor_id 
group by v.vendor_id, v.name, va.state_territory_province 
having va.state_territory_province = 'Illinois' 
    or count(cs.product_ID) > 1 

, 난 그냥 (바보 나)에 HAVING 절에 va.state_territory_province를 사용할 수없는, 그래서 추가 그것 GROUP BY 절. 모든 공급 업체에는 하나의 주소 만 있다고 가정합니다.

+1

지방을 GROUP BY에 넣어야합니다. 그렇지 않으면 Oracle에서 불평 할 것입니다. 또는 HAVING 절에서 'min (province)'를 참조하십시오. – mathguy

+2

또는 그와 유사한 것 : '일리노이 주'그 다음엔 1 이길 거라 '> 0' –

+0

너희들은 미쳤다. 나는 간신히 내 실수를 깨닫는 시간을 가졌습니다 :) – sstan

0

두 쿼리에 UNION 절을 사용하는 방법은 어떻습니까?

+0

잘 작동합니다! 가능한 문제는 너무 많은 내부 조인이 사용된다는 것입니다. 고맙습니다. –

1

은 내가 할 의향이 될 것이다 :

select v.* 
from gorcery.vendor v join 
    grocery.vendor_address va 
    on v.vendor_id = va.vendor_id 
where va.state_territory_province = 'Illinois' or 
     (select count(*) 
     from grocery.can_supply cs 
     where v.vendor_id = cs.vendor_id 
    ) > 1; 

참고 : 공급 업체가 여러 개의 주소를 가질 수 있기 때문에이 완벽하지 않습니다.따라서 더 나은 해결책은 다음과 같습니다.

select v.* 
from gorcery.vendor v 
where exists (select 1 
       from grocery.vendor_address va 
       where v.vendor_id = va.vendor_id and 
        va.state_territory_province = 'Illinois' 
      ) and 
     (select count(*) 
     from grocery.can_supply cs 
     where v.vendor_id = cs.vendor_id 
    ) > 1; 
+0

이것은 매우 잘 작동하며 가장 효율적인 솔루션입니다. 고맙습니다! –

+0

@ArielA. . . 이것은 외부 질의에서'group by '을 사용하는 솔루션보다 더 효율적이어야합니다. –

+0

감사합니다. 내가 질문했을 때 생각했던 것보다 훨씬 낫다. –