SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
WHERE daysdiff > 120
我知道
“无效的列名daysdiff”。
Maxlogtm是日期时间字段。是让我发疯的小东西。
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版本的答案。
如果要在WHERE
子句中使用别名,则需要将其包装在子选择或CTE中:
WITH LogDateDiff AS
(
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
)
SELECT logCount, logUserId, maxlogtm, daysdiff
FROM LogDateDiff
WHERE daysdiff > 120
不重复代码的最有效方法是使用HAVING而不是WHERE]
SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary
HAVING daysdiff > 120
如果您不想在CTE中列出所有列,另一种方法是使用outer apply
:
outer apply
如何使用子查询(这在Mysql中对我有用)?
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
具有在MySQL中的功能根据文档:
HAVING子句已添加到SQL,因为WHERE关键字无法与聚合函数一起使用。
您可以引用列别名,但需要使用SELECT * from (SELECT logcount, logUserID, maxlogtm
, DATEDIFF(day, maxlogtm, GETDATE()) AS daysdiff
FROM statslogsummary) as 'your_alias'
WHERE daysdiff > 120
进行定义:
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;
优点:
我将如何过滤用WHERE/GROUP BY/ORDER BY
创建的列?我试图只返回具有row_num值= 1的行。