子查询和加入的COUNT

时间:2014-06-03 09:57:54

标签: sql

伙计我试图在两个不同的SQL语句上使用COUNT。一个是使用连接,另一个是使用子查询。但问题是,两者都显示不同的行数。 那是为什么?

查询1:

SELECT  COUNT(*) AS 'Count',
        (SELECT c.CustomerName 
         FROM dbo.tblCustomer c 
         WHERE o.CustomerID = c.CustomerID) AS 'CustomerName',
        (SELECT ProductName 
         FROM dbo.tblProduct p 
         WHERE o.ProductID = p.ProductID) AS 'ProductName'
FROM dbo.tblOrder o
WHERE (o.OrderDate BETWEEN '2014-5-15' AND '2014-5-20')
GROUP BY o.CustomerID, o.ProductID

查询2:

SELECT  COUNT(*) AS 'Count', 
        dbo.tblCustomer.CustomerName, 
        dbo.tblProduct.ProductName
FROM dbo.tblCustomer 
INNER JOIN dbo.tblOrder ON dbo.tblCustomer.CustomerID = dbo.tblOrder.CustomerID 
INNER JOIN dbo.tblProduct ON dbo.tblOrder.ProductID = dbo.tblProduct.ProductID
WHERE (dbo.tblOrder.OrderDate BETWEEN '2014-5-15' AND '2014-5-20')
GROUP BY CustomerName,ProductName 

两个查询本质上是相同的,除了一个使用JOIN而另一个使用子查询。那么为什么我得到不同的行数呢?

1 个答案:

答案 0 :(得分:1)

在第一个查询中,您按ID分组,第二个查询按名称分组。因此,第一个查询为您提供每个客户和产品的计数,而第二个查询为您提供每个同名客户和同名产品的计数。

示例:

user 1 = John, user 2 = John
product a = toy, product b = toy
orders: 1 a, 1 a, 1 b, 2 a

查询1:

2, John, toy
1, John, toy
1, John, toy

查询2:

4, John, toy