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が説明したように、2番目のクエリはより多くのコードのように見え、より高価であるため、心配する必要はありません。同じ結果が得られるさまざまなクエリの効率を測定する場合は、コードの複雑さではなく、実行プランを比較してください。

于 2013-01-12T16:42:01.733 に答える