无法理解SQL代码

时间:2012-06-10 08:21:16

标签: sql-server count subquery calculated-field

我发现很难理解下面的代码。你能给我一个关于代码如何工作的逻辑流程吗?

问题 - 假设您要显示Customers表中每个客户的订单总数。订单与相应的客户ID一起存储在订单表中。

步骤 -

  1. 从customers表中检索客户列表。
  2. 对于检索到的每个客户,计算Orders表中关联订单的数量。
  3. 解决方案 -

    SELECT cust_name, cust_state, 
        (SELECT COUNT(*)
            FROM Orders
            WHERE Orders.cust_id = Customers.cust_id
        )
    AS order_nos
    FROM Customers
    ORDER BY cust_name
    

    我无法理解括号内的count(*)部分。请帮我解决一下。

    感谢。

2 个答案:

答案 0 :(得分:0)

它只计算行数。在这种情况下,这是每个客户的订单数量。替代 COUNT(column_name)为您提供 column_name 不为空的行数。

没有子查询的等价物(改为使用组):

SELECT cust_name, cust_state, COUNT(orders.cust_id) order_nos
FROM Customers
    LEFT OUTER JOIN Orders on Customers.cust_id = Orders.cust_id
GROUP BY cust_name, cust_state
ORDER BY cust_name

答案 1 :(得分:0)

它被称为相关子查询。从本质上讲,对于每个客户,您将获得客户拥有的订单数量。 “魔术”位于子查询的WHERE Orders.cust_id = Customers.cust_id子句中。这是将此结果与您的主查询相关联的部分。它说“从主查询中获取cust_id,现在找到cust_id是cust_id的订单数。”