1

我有一个查询:

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

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

提前致谢。

4

2 回答 2

5

就是那样子。

列别名不能在定义它们的同一逻辑级别上使用。如您所见,您将不得不使用派生表(子查询)。

如果您担心性能,请不要。派生表只是语法糖,它不会使查询变慢(与您首先尝试的解决方案相比)。

于 2013-01-12T16:35:31.437 回答
3

此特定查询的替代方法,它不会执行任何不同但更易于编写:

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

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

于 2013-01-12T16:42:01.733 回答