SQL Server 2008 - 为什么我不能在select count(*)as的查询中使用WHERE

时间:2014-12-03 11:09:43

标签: sql-server

我有这个查询可以正常工作:

Select 
    WB.BinNumber, WB.ID, 
    (select count(*) 
     from WMS_LocationBalance 
     where BinID = WB.ID) AS BinCount 
from 
    WMS_WarehouseBin WB
ORDER BY 
    BinCount

但是,在添加WHERE BinCount = 0时,查询无法运行,因为BinCount是无效的列名。

为什么我可以order by BinCount,但我无法在WHERE中使用?

我该如何解决这个问题?

Select 
    WB.BinNumber, 
    WB.ID, 
    (select count(*) 
     from Location 
     where BinID = WB.ID) AS BinCount 
from 
    WarehouseBin WB
WHERE 
    BinCount = 0
ORDER BY 
    BinCount

3 个答案:

答案 0 :(得分:4)

试试这个。您无法在Alias name中使用Where clause,因为在WHERE clause之前处理了SELECT clause(*),因此无法使用别名尝试使用derived table然后使用别名where子句中的名称

SELECT *
FROM   (SELECT WB.BinNumber,
               WB.ID,
               (SELECT Count(*)
                FROM   Location
                WHERE  BinID = WB.ID) AS BinCount
        FROM   WarehouseBin WB) A
WHERE  A.BinCount = 0
ORDER  BY a.BinCount 

答案 1 :(得分:1)

WHERE从源表中读取,并且是查询的一部分 - 这就是你的问题

ORDER BY可以在字段上使用,因为在获取数据后使用了ORDER BY - 它可以在数据被缓存后使用。

希望这能解释您的问题。

-

要获得解决方案,

我建议将数据插入"哈希表",甚至临时表(使用@变量),然后使用select对其进行排序。或者,使用子查询。

答案 2 :(得分:0)

我建议使用GROUP BY子句而不是使用子查询来重写查询(因为你不想要0' s,GROUP BY会自动删除)。更整洁。

SELECT   WB.BinNumber, WB.ID, COUNT(*) AS BinCount
FROM     WMS_WarehouseBin WB INNER JOIN WMS_LocationBalance L ON WB.ID = L.BinID
GROUP BY WB.BinNumber, WB.ID
ORDER BY BinCount