--如何在SQL Server实现类似RowNum伪列
--说明:Oracle中RowNum伪列一般按照表中数据的插入顺序排列,是查询时默认的数据输出排序方式
--建立测试样表
USE TSQL2012;
IF OBJECT_ID('dbo.Test', 'U') IS NOT NULL DROP TABLE dbo.Test;
CREATE TABLE dbo.Test(Name varchar(100));
INSERT INTO dbo.Test values
('Chris'),
('Nancy'),
('Alvin'),
('Sherman'),
('Erick'),
('Josie'),
('Sonia'),
('Joanna');
--法1,传统方法,即建立临时表,通过插入顺序确定RowNum伪列
select RowNum=IDENTITY(INT,1,1),Name into #T from dbo.Test
select * from #T
DROP TABLE #T;
--法2,窗口函数法,ROW_NUMBER() OVER() 函数中ORDER BY子句若不指定排序字段,则会产生按照原始插入顺序排列的RowNum伪列
--注意SQL Server在某些情况下,比如 "SELECT TOP 100 ColumnName FROM TABLENAME;"可能按照升序排列
--注意"SELECT 1"和"SELECT NULL"
--ROW_NUMBER()函数在语法上需要ORDER BY子句,所有在使用ROW_NUMBER()函数的时候必须包含这一子句。SELECT NULL是一个在未指定排序字段时的语法上的占位符。
--(接上句)在一些情况下我们不需要强制使用任意字段排序,此时最快得选项是使用SELECT NULL(或者使用SELECT 1、SELECT 2等)。查询优化器能识别这种方式,所以不会产生性能开销。
SELECT * FROM dbo.Test;
SELECT Name,RN=ROW_NUMBER() OVER(ORDER BY (SELECT 1))
FROM dbo.Test;
SELECT Name,RN=ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM dbo.Test;
with temp as (
SELECT Name,RN=ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM dbo.Test)
SELECT Name from temp
WHERE RN=7