SQL - 相关子查询

时间:2016-06-27 11:49:15

标签: sql database

我在理解这个相关子查询时遇到了问题:

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&lt;之间进行比较? CustomersOuter.CustomerID?如何解释+1?更深入的解释会很棒。

1 个答案:

答案 0 :(得分: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

由于没有ID&lt;的客户12在阿根廷count(*)返回零,+1得到1

第二行:

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

结果将是1(customerID = 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