我有这个查询可以正常工作:
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
答案 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