2016-06-27 11 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のペアに対して相関サブクエリが実行されます。最初の行の

:この場合は1とゼロを返しcount(*)アルゼンチンのID < 12とのカスタマーがありませんのよう

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

あなたは、2行目1

を取得します:

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

結果は1(custo merIDは12)+ 1 = 2

を=のように...

あなたが国を変更すると、実行してカウンターを持っているので、count(*)は、ゼロで再び始まる:それぞれの国が顧客の数をカウントするために。

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 
関連する問題