Chr*_*ris 1 sql t-sql sql-server
我有一个相当简单的SQL语句来从几个表中获得一些结果.其中一列是从内联SQL语句生成的.虽然我似乎能够通过此列进行排序,但尝试使用它进行过滤表示该列无效.这是我的代码和错误:
SELECT
e.Title as Title,
-- Get earliest start time and latest end time
(SELECT TOP 1 l.StartTime FROM Locations l WHERE l.EventID = e.EventID ORDER BY l.StartTime ASC) as EarliestStartTime,
(SELECT TOP 1 l.EndTime FROM Locations l WHERE l.EventID = e.EventID ORDER BY l.EndTime DESC) as LatestEndTime
FROM
Events e
WHERE
e.UserID = @UserID
AND LatestEndTime < DATEADD(DAY, GETDATE(), 1)
ORDER BY
EarliestStartTime ASC
Run Code Online (Sandbox Code Playgroud)
错误:
Invalid column name 'LatestEndTime'.
Run Code Online (Sandbox Code Playgroud)
如果我删除,AND LatestEndTime < DATEADD(DAY, GETDATE(), 1)那么语句完美无缺.
您不能在where子句中通过别名引用列.写出来,重复列定义:
WHERE e.UserID = @UserID
AND (SELECT TOP 1 l.EndTime FROM Locations l
WHERE l.EventID = e.EventID ORDER BY l.EndTime DESC) <
DATEADD(DAY, GETDATE(), 1)
Run Code Online (Sandbox Code Playgroud)
或使用子查询命名列:
select *
from (
select e.Title as Title,
-- Get earliest start time and latest end time
(SELECT TOP 1 l.StartTime FROM Locations l
WHERE l.EventID = e.EventID ORDER BY l.StartTime ASC)
as EarliestStartTime,
(SELECT TOP 1 l.EndTime FROM Locations l
WHERE l.EventID = e.EventID ORDER BY l.EndTime DESC)
as LatestEndTime
from Events e
) as SubQuery
WHERE UserID = @UserID
and LatestEndTime < DATEADD(DAY, GETDATE(), 1)
Run Code Online (Sandbox Code Playgroud)