繁体   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