2017-10-26 29 views
0

내가 here에서 인용하고있다 :MySQL의 - 진정한 수익을 존재하는 경우, 외부 쿼리의 결과는 더 이상 필터링하면 안

는 "당신은 적어도 하나의 배치 고객을 찾을 상관 하위 쿼리로 위의 쿼리를 사용할 수 있습니다

SELECT 
    customerNumber, 
    customerName 
FROM 
    customers 
WHERE 
    EXISTS(SELECT 
      orderNumber, SUM(priceEach * quantityOrdered) 
     FROM 
      orderdetails 
       INNER JOIN 
      orders USING (orderNumber) 
     WHERE 
      customerNumber = customers.customerNumber 
     GROUP BY orderNumber 
     HAVING SUM(priceEach * quantityOrdered) > 60000); 

" 당신은 결과를 볼 수 편집기 here에 코드를 붙여 넣을 수 있습니다 다음을 사용하여 60K보다 큰 총 가치와 판매 주문은 운영자가 존재한다.

하위 쿼리에서 WHERE 절을 생략하고 EXISTS 연산자가 TRUE을 반환한다고 가정합니다. 1) 그런 다음 왜 고객의 customerNumbercustomerName을 얻을 수 없습니까? 2) 얼마나 많은 시간이 EXISTS 연산자 평가입니까?

+0

1) 선택하지 않음 고객 번호 고객 이름 고객 고객이 "작동합니까? 그것해야합니다. EXISTS가 TRUE를 반환하면 쿼리가됩니다. – JochenJung

+0

질문 번호에 대한 답은 무엇입니까? 1 ? –

+0

1) 하위 쿼리가 어디에 있는지 알 수없는 경우 모든 고객의 총 가치가 주문 테이블에서> 60k 인 경우, 즉 하위 쿼리가 하나 이상의 행을 반환하는 경우에만 고객 테이블의 모든 고객을 가져옵니다. –

답변

-1

1) 하위 쿼리에서 where 절을 제거하면, 그것은 모든 CUSTOMERNAME 및 customernumbers을주고 다음의 조건 자격이 적어도 1 명 위해 현재 당신이했기 때문에 : 그러므로

HAVING SUM(priceEach * quantityOrdered) > 60000) 

을, 서브 쿼리가 반환 항상 것입니다 True.

위 조건을 충족하는 주문이 없으면 하위 쿼리는 항상 False을 반환하므로 아무 것도 표시하지 않습니다.

지금까지 서브 쿼리는 true를 반환하고 모든 고객을 표시합니다. 다음과 같이 다음을 확인 할 수 있습니다

SELECT 
    count(*) 
FROM 
    customers 
WHERE 
    EXISTS(SELECT 
      orderNumber, SUM(priceEach * quantityOrdered) 
     FROM 
      orderdetails 
       INNER JOIN 
      orders USING (orderNumber)  
     GROUP BY orderNumber 
     HAVING SUM(priceEach * quantityOrdered) > 60000); 

결과 :

count(*) 
--------- 
122 
지금

이 쿼리 실행

Select count(*) from customers; 

결과 :

count(*) 
--------- 
122 
0123을

이제 양쪽 모두 동일한 양의 행을 반환하므로 하위 쿼리가 모든 고객에게 true를 반환한다는 것을 알 수 있습니다.

2) 나는 그것에 대한 확실하거나 정확한 대답이 없다고 생각합니다. 일반적으로 쿼리 계획 프로그램/쿼리 최적화 프로그램은 EXISTS의 공동 관련 하위 쿼리를 으로 변환하므로 한 번만 실행됩니다.

더 많은 정보를 들어

, click here

는 희망이 도움이!

+0

downvote 이유? –

+0

답변이 잘못되었습니다. 또는 오히려 부정확하다. 그리고 당신의 "증거"는 가난합니다. 우연의 일치로 올바른 결과가 반환 되었기 때문에 그것이 항상 옳다는 것을 의미하지는 않습니다. – fancyPants

+0

우연이 아닙니다. where 절없이 부속 조회를 점검하고 행을 리턴합니다 (정확히 3 행). 즉, 모든 고객에게 사실로 돌아와서 모든 고객을 돌려주는 것을 의미합니다. 이 논리에서 잘못된 점은 무엇입니까? –

1

하위 쿼리에서 WHERE 절을 제거하면 orderNumber가있는 경우 모든 customerNumbers와 -names 만 얻을 수 있습니다 (priceEach * quantityOrdered> 60000 인 경우).없는 경우 행이 반환되지 않습니다.

두 번째 질문에 대해서는 귀하가 무슨 뜻인지 잘 모르겠습니다. WHERE EXISTS (SELECT whatever FROM foo의 특수 효과는 서브 쿼리가 부울 true 또는 0 이외의 값을 반환하면 WHERE x IN (SELECT y FROM foo)에 대항하는 EXISTS가 중지된다는 것입니다.IN (<subquery>)은 첫 번째 적중 후에 중지되지 않습니다. 네가 묻고있는거야?

+0

'EXISTS는 하위 쿼리가 부울 true 또는 값을 반환하자마자 x IN (SELECT y FROM foo)가 멈추는 것을 막습니다. 그렇다면 서브 쿼리에서'WHERE' 절을 생략하지 않을 때 왜 결과가 모든 고객에게 표시되지 않습니까? –

+0

모든 customerNumber에 대한 결과가 반환되지 않으므로. 외부 쿼리에서 customerNumbers가 여러 개 있습니다. 각 customerNumber는 하위 쿼리를 별도로 실행하는 데 사용됩니다. 다음과 같은 가능성이 있습니다. 1) orderDetails 테이블에 외부 쿼리의 customerNumber가있는 항목이 없습니다. 아무 결과도 리턴되지 않으며, 외부 조회는 customerName을 터 L 널에 인쇄하지 않습니다. 2) orderDetail에 항목이있는 customerNumber가 있지만 60000을 넘는 값의 순서가 없습니다. 하위 쿼리에서 결과가 반환되지 않으며 외부 쿼리의 customerName이 반환되지 않습니다. – fancyPants

+0

3) orderDetail 항목에 60000을 넘는 값이있는 customerNumber가 있습니다. 그러면 하위 쿼리에서 선택 항목과 상관없이 false 또는 0이 아닌 한 실제로 orderDetails에서 select 1을 선택할 수 있습니다. .. 가지다. ". 따라서 하위 쿼리가 true 또는 0이 아닌 결과를 반환하면 외부 쿼리는이 customerName을 반환합니다. – fancyPants