sql函数列不适用于where子句

时间:2013-01-12 16:22:36

标签: sql

我有一个问题:

SELECT ROW_NUMBER() OVER(ORDER BY LogId) AS RowNum 
FROM [Log] l
where RowNum = 1

我收到以下错误:

  

列名称'RowNum'无效。

我在这里进行了一些搜索,发现WHERE中没有列别名。

所以我尝试了以下内容并且有效:

select * 
from 
(
     SELECT ROW_NUMBER() OVER(ORDER BY LogId) AS RowNum 
     FROM [Log] l
) as t
where t.RowNum = 1

从性能的角度来看,是否有更好的方法来进行此查询?

提前致谢。

2 个答案:

答案 0 :(得分:5)

这就是它的方式。

列别名不能在定义它们的同一逻辑级别上使用。您必须使用已发现的派生表(子查询)。

如果你担心表现,那就不要了。派生表仅仅是语法糖,它不会使查询变慢(与您先尝试的解决方案相比)。

答案 1 :(得分:3)

这个特定查询的替代方案,它不会执行任何不同但写起来更简单:

SELECT TOP 1 <col list> FROM dbo.[Log] ORDER BY LogId;

正如@a_horse所解释的那样,不要担心,因为你的第二个查询看起来更像是更昂贵的代码。如果要测量获得相同结果的不同查询的效率,请比较它们的执行计划,而不是代码复杂性。