我正在尝试以下SQL查询:
select (execution_end_timestamp - execution_queued_timestamp) as totalTime, execution_queued_timestamp from exec_queue
where execution_name like '%Generate%'
and execution_queued_timestamp > '2012-10-04 20:00:00.000'
having totalTime < '1900-01-01 00:00:06.000'
我尝试在where和having子句中使用totalTime,在这两种情况下它都不起作用。我也尝试过希望可能有用的日期,但结果相同。
有没有一个技巧可以在where或having子句中使用计算字段?除了使用聚合函数的情况外,谷歌搜索没有发现任何东西。
答案 0 :(得分:3)
不,WHERE
子句不允许使用别名,请尝试
select (execution_end_timestamp - execution_queued_timestamp) as totalTime, execution_queued_timestamp
from exec_queue
where execution_name like '%Generate%' AND
execution_queued_timestamp > '2012-10-04 20:00:00.000' AND
(execution_end_timestamp - execution_queued_timestamp) < '1900-01-01 00:00:06.000'
ALIAS
对WHERE
和HAVING
子句不起作用的原因
from clause
中所有表格的产品。where clause
以消除不满足search_condition的行。group by clause
。having claus
e中search_condition的组。select clause
目标列表中的表达式。distinct keyword
,则现在会删除重复的行。union
被采用。order by clause
。答案 1 :(得分:2)
我曾经有过指向SQL-92,99和2003 ISO标准的链接,但this link目前也会这样做。
基本上,查询执行的顺序是
1. FROM/JOIN
2. WHERE/ON -- exception for LEFT JOIN
3. GROUP BY (incl. CUBE, ROLLUP, GROUPING SETS)
4. HAVING
5. SELECT
6. DISTINCT
7. ORDER BY
因此,为SELECT列创建的别名对WHERE和HAVING阶段不可见。它只是复制和粘贴表达式,非常简单。边缘情况可能是在处理长而复杂的公式时,这可能会更好地取消查询,例如。
select totalTime,
execution_queued_timestamp
from (
select (execution_end_timestamp - execution_queued_timestamp) as totalTime,
execution_queued_timestamp
from exec_queue
where execution_name like '%Generate%'
and execution_queued_timestamp > '2012-10-04 20:00:00.000'
) x
where totalTime < '1900-01-01 00:00:06.000'
我会给你一个提示。 SQL Server实际上知道将WHERE过滤器带入内部查询并将其应用于基表,因此不会损失性能!