2014-12-03 97 views
0

我有這個疑問這工作,它應該做的:SQL Server 2008中 - 爲什麼我不能使用WHERE上查詢從SELECT COUNT(*)作爲

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 

回答

4

試試這個。因爲WHERE clause處理您不能在Where clause使用Alias nameSELECT 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

WHERE從源表中讀取的別名,是查詢的一部分 - 其中存在您的問題

ORDER BY可以在該字段上使用,因爲在獲取數據後使用ORDER BY - 它在數據被緩存後使用。

希望這可以解釋您的問題。

-

對於分辨率,

我建議在將數據插入一個「哈希表」,或甚至一個臨時表(使用@變量),然後用選擇訂購它。或者,使用子查詢。

0

我建議用GROUP BY子句而不是使用子查詢重寫查詢(因爲你不想要0,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 
相關問題