2014-07-16 4 views
0

다음에 수행해야 할 일에 붙어 있습니다. 특정 도시에있는 공급 업체가 공통 부분을 제공하는지 여부를 알려주는 쿼리를 작성해야합니다. 나는 다음과 같은 쿼리를 생성 한하위 쿼리 결과 비교

select sh1.partno,sh1.supplierno 
from shipments sh1 
where sh1.supplierno IN (
    select s.supplierno 
    from suppliers s 
    where s.city = 'LONDON') 

partno supplierno 
    P1 S1 
    P1 S1 
    P3 S1 
    P3 S1 
    P3 S1 
    P6 S4 
    P2 S4 
    P5 S4 
    P5 S4 

내가 다음에 무엇을해야하는지에 붙어 반환합니다. 다음은 지정된 도시의 공급 업체가 제공하는 모든 부품입니다. 이 두 열을 어떻게 비교하여 supplierno 열에 나열된 서로 다른 두 공급 업체 번호로 공통 부품 번호가 배송되는지 알고 싶습니다. 나는 이것이 결과가 아닐 것이라는 것을 안다. 그러나 나는 앞으로 나아갈 길을 알 필요가있다.

미리 감사드립니다.

+0

원하는 결과는 무엇입니까? –

+0

필요한 구문은'GROUP BY .. HAVING'입니다. 이 숙제가 있니? –

+0

아마도 이와 같은 것이 있을까요? http : // stackoverflow.귀하의 경우 COM/질문/8149210은/얼마나-DO-I 찾기 - 중복 -에서 - 다중 열 당신이 선택 s.city, t. * [화물]에서의 가 결합 할 것입니다 ( 선택 PARTNO , supplierno, count (*) as quantity from [출하] 그룹 by partno, supplierno 카운팅 (*)> 1 ) on t.partno = t.partno 및 s.supplierno = t.supplierno – Tim

답변

1

자기 조인은 원하는 것일 수 있습니다.

select yourfields 
from shipments sh1 join shipments sh2 on sh1.partno = sh2.partno 
and sh1.supplierid <> sh2.supplierid 
etc 

편집

같은 쿼리 키워드를 가입없이 당신이 (도시 필터링) 공급 업체 및 부품의 기본 목록을 시작하는 경우

select yourfields 
from shipments sh1, shipments sh2 
where sh1.partno = sh2.partno 
and sh1.supplierid <> sh2.supplierid 
etc 
+0

우리는 join 키워드를 불행하게 사용할 수 없습니다. – user3786519

+0

강사는 카디 전 제품을 고려하거나 닮은 것을 사용하지 않기를 매우 단호합니다. – user3786519

+0

좋아, 편집에서 그 부분을 사용할 수있게되었습니다. 마지막 부분은 다른 테이블에서 supplierno를 장치하는 방법을 파악하고 공급자 ID에이를 삽입하는 것입니다. 공급 업체 City = "LONDON"제 질문은 sh1.supplierid와 sh2.supplierid를 다른 테이블의 값으로 만드는 방법이 될 것 같습니까? – user3786519

0

, 초기 쿼리는 다음과 같습니다

SELECT sh1.partno,sh1.supplierno 
FROM 
    shipments sh1 
    INNER JOIN 
    suppliers s ON 
     sh1.supplierno = s.supplierno 
WHERE s.city = 'LONDON' 

여기에는 공급 업체 및 부품 목록이 나와 있습니다. JOIN을 사용할 수 없다는 것은 당신을 제한하는 것입니다. 저는 실제로 적절하게 필터링 된 데카르트 제품을 자체 조인하는 것을 고려하지 않지만,이 클래스는 자신의 클래스입니다. 반면에, 당신이 찾고있는

SELECT sh1.partno, COUNT(DISTINCT sh1.supplierno) AS NumberOfSuppliers 
FROM 
    shipments sh1 
    INNER JOIN 
    suppliers s ON 
     sh1.supplierno = s.supplierno 
WHERE s.city = 'LONDON' 
GROUP BY sh1.partno 
HAVING MIN(sh1.supplierno) <> MAX(sh1.supplierno) 

경우 : 당신은 다음과 같이 원하는 경우

당신은 부품 단지 목록을 얻기 위해 GROUP BY 및 HAVING 절을 사용할 수 있습니다 부품과 공급자가 있으면 공급 업체 목록 조항을 다른 공급 업체 및 부품 목록과 함께 사용해야합니다. JOIN이 가장 이해하기 쉽지만 EXISTS 키워드가 여기에 도움이 될 수 있습니다 - 다음과 같은 것이 당신이 찾고 싶어 할 수도 있습니다 (내 머리 꼭대기에서 이것이 옳았는지 기억할 수 없거나, 그래서 그것이 작동하는지 나에게 알려주세요).

SELECT sh1.partno, sh1.supplierno 
FROM 
    shipments sh1 
    INNER JOIN 
    suppliers s ON 
     sh1.supplierno = s.supplierno 
WHERE 
    s.city = 'LONDON' AND 
    EXISTS 
     (
     SELECT sh2.supplierno 
     FROM 
      shipments sh2 
      INNER JOIN 
      suppliers s2 ON 
       sh2.supplierno = s2.supplierno 
     WHERE 
      s2.City = 'LONDON' AND 
      sh2.supplierno != sh1.supplierno AND 
      sh2.partno = sh1.partno 
    ) 

그러나 @Dan Bracuk이 제안한 자체 조인을 권장합니다.

+0

내가 읽은 모든 것을 바탕으로 감사드립니다.이 모든 경우에 나는 강사가 제공했습니다. 감사합니다. – user3786519

0

런던에서 공급 업체의 수 :

select count(distinct s.supplierno) 
from suppliers s 
where s.city = 'LONDON' 

PARTNO 당 런던에서 공급 업체의 수 :

select sh1.partno, count(distinct sh1.supplierno) 
from shipments sh1 
where sh1.supplierno IN (
    select s.supplierno 
    from suppliers s 
    where s.city = 'LONDON' 
) 
group by sh1.partno 

어느 PARTNO 런던에서 공급 업체가 런던에 많은 공급 업체가? 힌트, 갖는 것은 남은 것을 단순화합니다