ROW_NUMBER() 語法強制要求 OVER (ORDER BY ...),但有時只想依資料原本順序編號,不想付出排序成本。
-- 不排序,直接依原始順序產生流水號
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS ROWNUM, *
FROM Product;
-- 分頁查詢範例
WITH query AS (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS ROWNUM, *
FROM Product
)
SELECT * FROM query WHERE ROWNUM BETWEEN 5 AND 10;
(SELECT 0) 為常數運算式,SQL Server 最佳化器識別為「無排序需求」,直接依輸入順序分配號碼。Sort 運算子,效能提升明顯。SELECT ROW_NUMBER() OVER (ORDER BY Oper_Date DESC) AS ROWNUM, *
FROM Product;
SQL Server 2005 及以上版本皆支援。NHibernate 等 ORM 產生的分頁 SQL 常採用此模式。