SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
我得到
无效的列名daysdiff。
Maxlogtm是一个datetime字段。就是这些小事让我抓狂。
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
我得到
无效的列名daysdiff。
Maxlogtm是一个datetime字段。就是这些小事让我抓狂。
当前回答
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)
通常不能在WHERE子句中引用字段别名。(可以把它看作包括别名在内的整个SELECT应用在WHERE子句之后。)
但是,正如在其他回答中提到的,您可以强制SQL将SELECT处理为在WHERE子句之前处理。这通常用圆括号来强制逻辑操作顺序或使用公共表表达式(CTE):
括号/子查询:
SELECT
*
FROM
(
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
) as innerTable
WHERE daysdiff > 120
或者看看亚当的CTE版本的答案。
其他回答
如何使用子查询(这为我在Mysql工作)?
SELECT * from (SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary) as 'your_alias'
WHERE daysdiff > 120
如果你不想在CTE中列出你所有的列,另一种方法是使用outer apply:
select
s.logcount, s.logUserID, s.maxlogtm,
a.daysdiff
from statslogsummary as s
outer apply (select datediff(day, s.maxlogtm, getdate()) as daysdiff) as a
where a.daysdiff > 120
HAVING适用于MySQL 根据文件:
HAVING子句被添加到SQL中,因为WHERE关键字不能 与聚合函数一起使用。
你可以引用列别名,但你需要使用CROSS/OUTER APPLY来定义它:
SELECT s.logcount, s.logUserID, s.maxlogtm, c.daysdiff
FROM statslogsummary s
CROSS APPLY (SELECT DATEDIFF(day, s.maxlogtm, GETDATE()) AS daysdiff) c
WHERE c.daysdiff > 120;
DBFiddle演示
优点:
表达式的单一定义(更容易维护/不需要复制-粘贴) 不需要用CTE/outerquery包装整个查询 可以在WHERE/GROUP BY/ORDER BY中引用 可能获得更好的性能(单次执行)
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE ( DATEDIFF(day, maxlogtm, GETDATE() > 120)
通常不能在WHERE子句中引用字段别名。(可以把它看作包括别名在内的整个SELECT应用在WHERE子句之后。)
但是,正如在其他回答中提到的,您可以强制SQL将SELECT处理为在WHERE子句之前处理。这通常用圆括号来强制逻辑操作顺序或使用公共表表达式(CTE):
括号/子查询:
SELECT
*
FROM
(
SELECT
logcount, logUserID, maxlogtm,
DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
) as innerTable
WHERE daysdiff > 120
或者看看亚当的CTE版本的答案。