[英]SQL Where clause order
我有這個 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
關鍵字之后。
我敢肯定這對你們 SQL 伙計們來說是微不足道的,但我一直在閱讀,但我無法在網上找到任何包含我擁有的所有元素的資源。
您不能通過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 個加工零件。 由於在處理WHERE
時尚未處理SELECT
,因此無法引用其中定義的內容 [ SELECT
]。 在編程意義上,這就像在定義變量之前嘗試引用它。
根據文檔,操作順序如下(請注意並非總是如此,但前面鏈接的文檔更詳細地介紹了這一點):
- 從
- 上
- 加入
- 在哪里
- 通過...分組
- WITH CUBE 或 WITH ROLLUP
- 擁有
- SELECT
- 清楚的
- 訂購方式
- 最佳
謝謝拉努,我會在 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
這也有效。 有誰知道這些選項中的哪些是最佳實踐,或者每個選項的性能?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.