2013-09-26 3 views
0

Возьми этот запрос:Как COUNT (*) ведет внутреннее соединение

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()?

+4

он будет считать все строки из результата объединения. Может быть, вы хотите 'COUNT (DISTINCT c.CustomerID)' –

+0

Ahhh im с вами. Результатом объединения является новая таблица! Получил это сейчас! –

ответ

3

запросы Обработка заказы ...

ЕКОМА обрабатываются перед ЗЕЬЕСТОМ - что сказать - к тому времени SELECT, вступают в игру, есть только один (виртуальный) стол он выбирает от, а именно, индивидуальных таблиц после их соединенных (JOIN), отфильтрованных (ГДЕ) и т. д.

Если вы хотите просто пересчитать один стол, вы можете попробовать несколько вещей ...

COUNT(DISTINCT table1.id) 

or tu rn таблицу, которую вы хотите подсчитать, в подзапрос с count() внутри него

Смежные вопросы