COUNT(*)如何在内部联接中表现

时间:2013-09-26 18:29:32

标签: tsql sql-server-2012

采取此查询:

SELECT c.CustomerID, c.AccountNumber, COUNT(*) AS CountOfOrders,
    SUM(s.TotalDue) AS SumOfTotalDue
FROM Sales.Customer AS c
INNER JOIN Sales.SalesOrderheader AS s ON c.CustomerID = s.CustomerID
GROUP BY c.CustomerID, c.AccountNumber
ORDER BY c.CustomerID;

我希望COUNT(*)计算Sales.Customer中的行数,但令我惊讶的是它计算了连接表中的行数。

知道为什么会这样吗?另外,有没有办法明确指定COUNT()应该在哪个表上运行?

1 个答案:

答案 0 :(得分:3)

查询处理订单...

在SELECT子句之前处理FROM子句 - 也就是说 - 当SELECT进入游戏时,它只选择一个(虚拟)表 - 即,各个表 后加入(JOIN),过滤(WHERE)等

如果您只想数一张桌子,那么您可以尝试几件事......

COUNT(DISTINCT table1.id)

或者将您想要计数的表转换为其中包含count()的子查询