我有一个问题:
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
从性能的角度来看,是否有更好的方法来进行此查询?
提前致谢。
答案 0 :(得分:5)
这就是它的方式。
列别名不能在定义它们的同一逻辑级别上使用。您必须使用已发现的派生表(子查询)。
如果你担心表现,那就不要了。派生表仅仅是语法糖,它不会使查询变慢(与您先尝试的解决方案相比)。
答案 1 :(得分:3)
这个特定查询的替代方案,它不会执行任何不同但写起来更简单:
SELECT TOP 1 <col list> FROM dbo.[Log] ORDER BY LogId;
正如@a_horse所解释的那样,不要担心,因为你的第二个查询看起来更像是更昂贵的代码。如果要测量获得相同结果的不同查询的效率,请比较它们的执行计划,而不是代码复杂性。