5

row_number オーバーを使用して、テーブルから特定の行を選択しようとしています。ただし、SQL は「無効な列名 'ROWNUMBERS'」というエラー メッセージを表示します。誰でも私を修正できますか?

SELECT ROW_NUMBER() OVER (ORDER BY  Price ASC) AS ROWNUMBERS, * 
FROM Product
WHERE  ROWNUMBERS BETWEEN  @fromCount AND @toCount
4

2 に答える 2

19

句でエイリアス化された列を参照しようとしてWHEREも、論理クエリ処理が行われるため機能しません。は句のWHERE前に評価されます。したがって、が評価されるときSELECT、列ROWNUMBERSは存在しません。WHERE

この例で列を参照する正しい方法は次のとおりです。

SELECT a.*
FROM
    (SELECT ROW_NUMBER() OVER (ORDER BY  Price ASC) AS ROWNUMBERS, * 
    FROM Product) a
WHERE a.ROWNUMBERS BETWEEN @fromCount AND @toCount

参考までに、操作の順序は次のとおりです。

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY
于 2013-09-30T13:20:46.913 に答える
2

報告された特定のエラーを解決する別の回答がここにあります。しかし、私はより広い問題にも取り組みたいと思っています。ここで行っていることは、結果を表示するためにページングしているように見えます。その場合、および Sql Server 2012 を使用できる場合は、より良い方法があります。見てみましょうOFFSET/FETCH

SELECT First Name + ' ' + Last Name 
FROM Employees 
ORDER BY First Name 
OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;

これは、ページ サイズが 5 のクエリの 3 ページ目を表示します。

于 2013-09-30T13:37:49.680 に答える