如果我这样做——
SELECT dv.Name
,MAX(hb.[DateEntered]) as DE
FROM
[Devices] as dv
INNER JOIN
[Heartbeats] as hb ON hb.DeviceID = dv.ID
WHERE DE < '2013-03-04'
GROUP BY dv.Name
我得到这个错误 -
消息 207,级别 16,状态 1,第 17 行无效的列名称“DE”。
如果我这样做——
SELECT Name, DE FROM (
SELECT dv.Name
,MAX(hb.[DateEntered]) as DE
FROM
[Devices] as dv
INNER JOIN
[Heartbeats] as hb ON hb.DeviceID = dv.ID
GROUP BY dv.Name
) as tmp WHERE tmp.DE < '2013-03-04'
它按预期工作。
有人可以解释为什么我需要将我的主查询嵌套为子查询来限制我的数据集吗?
另外,是否有更好的方法来实现这里的目标?从一个表中检索所有记录,以及按[DateEntered]
降序排列的单个“顶部”相关记录?
您不能在
WHERE
子句中引用别名 - 这只是因为 SQL Server 解析语句的顺序。在这里和 StackOverflow 上对此进行了很多讨论。提供一些背景的几个例子:
https://dba.stackexchange.com/questions/19762/why-is-the-select-clause-listed-first/
为什么以不允许在大多数子句中使用列别名的方式解析查询?
另一种选择是:
这里有几件事很重要。首先,有一个发生的处理的逻辑顺序。
DE
并且,子句中的列别名的分配SELECT
发生在WHERE
处理子句之后。因此,别名在子句DE
中无效。WHERE
请注意,子查询解决方案在外部查询之前进行逻辑处理,因此
DE
在您引用它之前将别名分配给列。您可以更改原始查询以执行您想要的操作。这是一种方法。
将日期测试移至
HAVING
子句,您可以在其中测试聚合。这将在分组后排除数据。希望这就是你想要做的。