[英]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.