2017-04-20 1 views
0

이 쿼리가 올바른 결과를 표시하지 않습니다. 그것은 모든 CustomerId를 보여줍니다.SQL : 부속 조회의 다중 내부 조인

select Customers.customerid, Customers.custfirstname, Customers.custlastname from customers 
where exists (select * from customers c 
inner join orders o on c.CUSTOMERID=o.CUSTOMERID 
inner join ORDER_DETAILS od on o.ordernumber = od.ORDERNUMBER 
inner join products on products.PRODUCTNUMBER= od.PRODUCTNUMBER 
where products.CATEGORYID= 2 and o.customerid = o.customerid); 

상기 결과는 I가 상기 질의와 동일한 의미를 만들어

CUSTOMERID CUSTFIRSTNAME    CUSTLASTNAME    
---------- ------------------------- ------------------------- 
     1001 Suzanne     Viescas     
     1002 William     Thompson     
     1003 Gary      Hallmark     
     1004 Robert     Brown      
     1005 Dean      McCrae     
     1006 John      Viescas     
     1007 Mariya     Sergienko     
     1008 Neil      Patterson     
     1009 Andrew     Cencini     
     1010 Angel      Kennedy     
     1011 Alaina     Hallmark     
     1012 Liz      Keyser     
     1013 Rachel     Patterson     
     1014 Sam      Abolrous     
     1015 Darren     Gehring     
     1016 Jim      Wilson     
     1017 Manuela     Seidel     
     1018 David      Smith      
     1019 Zachary     Ehrlich     
     1020 Joyce      Bonnicksen    
     1021 Estella     Pundt      
     1022 Caleb      Viescas     
     1023 Julia      Schnebly     
     1024 Mark      Rosales     
     1025 Maria      Patterson     
     1026 Kirk      DeGrasse     
     1027 Luke      Patterson     
     1028 Jeffrey     Tirekicker    

28 rows selected 

이다 해당 검색어가 올바른 결과를 나타낸다. 그것은 단지 products.CATEGORYID = 2

select distinct c.customerid, c.custfirstname, c.custlastname from customers c 
inner join orders o on o.customerid=c.CUSTOMERID 
inner join ORDER_DETAILS od on od.ORDERNUMBER=o.ORDERNUMBER 
inner join products p on p.PRODUCTNUMBER=od.productnumber 
where p.CATEGORYID= 2 
order by 1; 

올바른 결과를 구입 한 고객이

CUSTOMERID CUSTFIRSTNAME    CUSTLASTNAME    
    ---------- ------------------------- ------------------------- 
      1002 William     Thompson     
      1004 Robert     Brown      
      1005 Dean      McCrae     
      1006 John      Viescas     
      1007 Mariya     Sergienko     
      1008 Neil      Patterson     
      1009 Andrew     Cencini     
      1010 Angel      Kennedy     
      1011 Alaina     Hallmark     
      1012 Liz      Keyser     
      1013 Rachel     Patterson     
      1014 Sam      Abolrous     
      1016 Jim      Wilson     
      1017 Manuela     Seidel     
      1018 David      Smith      
      1019 Zachary     Ehrlich     
      1020 Joyce      Bonnicksen    
      1021 Estella     Pundt      
      1023 Julia      Schnebly     
      1024 Mark      Rosales     
      1025 Maria      Patterson     
      1026 Kirk      DeGrasse     
      1027 Luke      Patterson     

    23 rows selected 

첫 번째 쿼리의 문제가 무엇이며, 그 결과는 보여줍니다?

+0

'있는지 확인 EXISTS'가 하위 쿼리의 결과가 없습니다. 하위 쿼리는 적어도 하나의 고객이 해당 CategoryID에서 구입했기 때문에 레코드를 반환하므로 모든 레코드가 외부 쿼리에서 테스트를 통과합니다. 당신이'o.customerid = o.customerid'와 상관 관계가있는 부질의를하려고 시도한 것 같지만 말도 안됩니다. 'o.customerid = o.customerid'는 항상 true입니다. 대신에 :'customer.customerid = o.customerid' 그러면 외부 쿼리 고객 테이블을 내부 쿼리의'o' 테이블과 비교할 수 있습니다. – JNevill

+0

내부 조인 오더는 c.CUSTOMERID = o.CUSTOMERID 부분은 customer.customerid = o.customerid 부분을 다룹니다. 결과는 같습니다. "and o.customerid = o.customerid"부분을 없애면 결과는 같습니다. 그래도 고마워! – vincnet

답변

0

JNevill이 지적했듯이 EXISTS은 하위 쿼리에 결과가 있으면 true를 반환합니다. 당신이 변경하면이 될 수 있습니다 :이 대신 o.customerid = c.customerid의 오타처럼 보이는이가 당신의 INNER JOIN 상태로 덮여로

SELECT c.customerid, c.custfirstname, c.custlastname 
FROM customers AS c 
WHERE c.customerid IN (SELECT [subquery here...] 
         WHERE products.CATEGORYID = 2) 

귀하의 하위 쿼리 o.customerid = o.customerid 필요하지 않습니다.

는 **** 편집 ****

SELECT c1.customerid, 
     c1.custfirstname, 
     c1.custlastname 
FROM customers AS c1 
WHERE EXISTS (SELECT 1 
       FROM customers c2 
       INNER JOIN orders o ON c2.CUSTOMERID = o.CUSTOMERID 
       INNER JOIN ORDER_DETAILS od ON o.ordernumber = od.ORDERNUMBER 
       INNER JOIN products ON products.PRODUCTNUMBER = od.PRODUCTNUMBER 
       WHERE products.CATEGORYID = 2 AND c2.customerid = c.customerid) 

이 가장 좋은 방법은 그냥 그 자체로 당신의 하위 쿼리 것 [버전이 존재] :

SELECT c.customerid, 
     c.custfirstname, 
     c.custlastname 
FROM customers AS c 
INNER JOIN orders o ON c.CUSTOMERID = o.CUSTOMERID 
INNER JOIN ORDER_DETAILS od ON o.ordernumber = od.ORDERNUMBER 
INNER JOIN products ON products.PRODUCTNUMBER = od.PRODUCTNUMBER 
WHERE products.CATEGORYID = 2 
+0

고마워요! 그것은 작동합니다. 그러나 내가 대신 실존을 사용할 수있는 방법이 있습니까? – vincnet

+0

첫 번째 답변에 2 가지 해결책을 추가했습니다. 하나는 EXISTS를 포함합니다. 이 작업을 수행하는 가장 간단한 방법은 서브 쿼리가 전혀 없기 때문에 나는 이것을 권장하지 않습니다. – Alex

+0

도와 주셔서 감사합니다. 이것은 나의 첫 번째 질문이었다. 도와 주셔서 감사합니다. – vincnet