2016-06-27 7 views
-1

나는이 상관 하위 쿼리를 이해하는데 문제가 :SQL - 상관 관계 서브 쿼리

SELECT Country, CustomerID, 
    (SELECT COUNT(*) 
    FROM Customers AS CustomersInner 
    WHERE CustomersInner.CustomerID < CustomersOuter.CustomerID 
    AND CustomersInner.Country=CustomersOuter.Country) + 1 
AS customer_seq_num 
FROM Customers AS CustomersOuter ORDER BY Country; 

이 예는 어떻게이 쿼리 작업 정확히 http://www.w3schools.com/sql/trysql.asp?filename=trysql_select_all

에서이다? CustomersInner.CustomerID < CustomersOuter.CustomerID를 비교하는 이유는 무엇입니까? +1은 어떻게 설명 될 수 있습니까? 더 깊은 설명이 좋을 것입니다.

+0

대부분의 데이터베이스에서이 목적으로'rank() '를 사용합니다. 대신 창 함수를 공부하는 것이 좋습니다. –

답변

2

상관 된 부속 조회는 기본 조회의 모든 행에 대해 실행됩니다. 이 경우 기본 쿼리는

SELECT Country, CustomerID 
    FROM Customers As CustomersOuter 
ORDER BY Country 

이 쿼리는 국가별로 모든 고객 ID 순서를 반환합니다.

Country | Customer ID 
----------------------- 
Argentina | 12 
Argentina | 54 
Argentina | 64 
Austria | 20 
Austria | 59 

각국/고객 ID 쌍에 대해 상관 하위 쿼리가 실행됩니다.

첫 번째 행의 경우 :이 경우

SELECT COUNT(*) 
    FROM Customers AS CustomersInner 
WHERE CustomersInner.CustomerID < 12 
    AND CustomersInner.Country='Argentina') + 1 

당신은 두 번째 행에 대해 1

을 얻을 count(*) 반환 한 제로 아르헨티나 ID < 12 고객이 아니다으로 :

SELECT COUNT(*) 
    FROM Customers AS CustomersInner 
WHERE CustomersInner.CustomerID < 54 
    AND CustomersInner.Country='Argentina') + 1 

결과는 1이됩니다 (custo merID는 실행중인 카운터 그래서 12) + 1 = 2

등등은 ...

당신이 국가를 변경합니다 count(*)가 0에서 다시 시작 = 각 국가는 고객의 수를 계산하기위한 .

Country | Customer ID | customer_seq_num 
------------------------------------------ 
Argentina | 12   | 1 
Argentina | 54   | 2 
Argentina | 64   | 3 
Austria | 20   | 1 <--- change country, reset counter (no customerID < 20 in 'Austria') 
Austria | 59   | 2