我在理解这个相关子查询时遇到了问题:
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?更深入的解释会很棒。
答案 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