2016-10-14 7 views
0

이전에 요청한 것과 비슷한 질문을하지만 두 개 이상의 테이블을 보지 못했습니다. 그리고 차이가있는 것 같습니다.SQL EXISTS는 두 개 이상의 테이블이있는 모든 행을 반환합니다.

은 내가 필드를 필요가있는 세 개의 테이블을 가지고 내가 customerIDorderID 필요 customers 내가 customerID를 얻을 수있는 ordersorderID 내가 얻을 수있는 lineitems에서 orderIDquantity (= 수량 주문). 그것은 나에게 모든 행의 수를 반환하는 이유를 이해가 안

SELECT COUNT(DISTINCT custID) 
FROM customers 
WHERE EXISTS(
    SELECT * 
    FROM customers C, orders O, lineitems L 
    WHERE C.custID = O.custID AND O.orderID = L.orderID AND L.quantity > 2 
    ); 

:

나는 많은 고객 그래서 기본적으로 동일한 항목의 2 개 이상 구입과 수량>이 방법을 찾고 싶어요. > 2 조건을 검사하기 전에 서브 쿼리를 상관시키고 있습니까? 아닙니다.

저는 초보자이기 때문에 필요할 경우 근본적으로 설명해 주시면 감사하겠습니다. 감사.

답변

2

EXISTS 하위 쿼리에서 customers 테이블을 반복 할 필요가 없습니다. 이것은 상관 관계 개념입니다. 외부 쿼리의 테이블을 사용하여 상호 연관시킵니다.

SELECT COUNT(DISTINCT custID) 
FROM customers c 
WHERE EXISTS(
    SELECT * 
    FROM orders O 
    JOIN lineitems L ON O.orderID = L.orderID 
    WHERE C.custID = O.custID AND L.quantity > 2 
    ); 
+0

다시 고객을 반복함으로써 오류가 발생 했습니까? 또는'FROM ... WHERE ... '대신'JOIN'을 사용하면 여러 테이블을 사용할 때 차이가 생깁니 까? – sandboxj

+1

@sandboxj 예 오류는 'customers'테이블을 다시 사용하기 때문에 발생합니다. 이는 상관 관계를 상쇄합니다. 쉼표로 분리 된 테이블을 가진 구식 구문 대신 위의 쿼리 에서처럼 현대적인'JOIN' 구문을 사용하는 것이 더 좋습니다. –

1

나는이 집계으로이 문제를 접근하는 것입니다 :

select count(distinct customerid) 
from (select o.customerid, l.itemid, count(*) as cnt 
     from lineitems li join 
      orders o 
      on o.orderID = l.orderId 
     group by o.customerid, l.itemid 
    ) ol 
where cnt >= 2; 

내부 쿼리는 각 고객이 구입 한 항목의 수를 계산합니다. 외부는 고객 수를 계산합니다.

편집 :

나는 위의 답변에 대한 질문을 오해 할 수있다. 당신은 어디서 quantity >= 2을 원하는 경우에, 그 훨씬 쉽게 :

select count(distinct o.customerid) 
from lineitems li join 
    orders o 
    on o.orderID = l.orderId 
where l.quantity >= 2; 

이 쿼리를 표현하는 가장 간단한 방법은 아마이다.

0

나는

은 내부 이 l.orderID = o.orderID에 lineitems 리터 가입 수 (*) 오 에서 주문을 선택하려고하면 "조인"을 사용하는 것이 좋습니다 l.quantity> 2