我有這個 SQL 查詢:
SELECT
Runs.runID, Runs.runDateTime,
COUNT(Files.destFileID) AS FileCount
FROM
Runs
LEFT OUTER JOIN
Files ON Files.runID = Runs.runID
WHERE
FileCount > 0
GROUP BY
Runs.runID, Runs.runDateTime
ORDER BY
Runs.runDateTime
它運行良好并顯示沒有該WHERE行的預期結果,但我確實需要過濾結果資料,因為這意味著。
我得到的錯誤是
無效的列名“FileCount”
在WHERE關鍵字之后。
我一直在閱讀,但在網上找不到任何包含我擁有的所有元素的資源。
uj5u.com熱心網友回復:
您不能通過在 中的別名來參考列WHERE,您需要在WHERE. 但是,由于您擁有的運算式是一個聚合,因此您實際上需要將其放入HAVING:
SELECT R.runID,
R.runDateTime,
COUNT(F.destFileID) AS FileCount
FROM dbo.Runs R
LEFT OUTER JOIN dbo.Files ON F.runID = R.runID
GROUP BY R.runID,
R.runDateTime
HAVING COUNT(F.destFileID) > 0
ORDER BY R.runDateTime;
要詳細說明為什么不能通過它在WHERE(或HAVING此處)中的別名參考該列,這是由于SELECT 陳述句的邏輯處理順序,這表明WHERE處理的是第 4 部分HAVING,但是,第 7部分SELECT是第 8 個處理的部分。由于在SELECT處理 時尚WHERE未處理,因此無法SELECT參考其中定義的內容 [the ]。從編程的角度來看,這就像在定義變數之前嘗試參考它。
根據檔案,操作順序如下(注意,情況并非總是如此,但前面鏈接的檔案更詳細地介紹了這一點):
- 從
- 在
- 加入
- 在哪里
- 通過...分組
- WITH CUBE 或 WITH ROLLUP
- 有
- 選擇
- 清楚的
- 訂購者
- 最佳
uj5u.com熱心網友回復:
謝謝 Larnu,我會在 10 分鐘到期后接受你的回答,但在發布我的問題后,我發現我可以對整個事情進行子查詢:
SELECT *
FROM (
SELECT Runs.runID ,Runs.runDateTime ,COUNT(Files.destFileID) AS FileCount
FROM Runs
LEFT OUTER JOIN Files ON Files.runID = Runs.runID
WHERE FileCount > 0
GROUP BY Runs.runID, Runs.runDateTime
ORDER BY Runs.runDateTime
)
AS results
WHERE FileCount > 0
ORDER BY runDateTime
這也有效。有誰知道這些選項中哪些是最佳實踐,或者每個選項的性能?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/384635.html
標籤:sql sql-server 查询语句
