簡體   English   中英

SQL Where 子句順序

[英]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 ]。 在編程意義上,這就像在定義變量之前嘗試引用它。

根據文檔,操作順序如下(請注意並非總是如此,但前面鏈接的文檔更詳細地介紹了這一點):

  1. 加入
  2. 在哪里
  3. 通過...分組
  4. WITH CUBE 或 WITH ROLLUP
  5. 擁有
  6. SELECT
  7. 清楚的
  8. 訂購方式
  9. 最佳

謝謝拉努,我會在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM