奇怪的行为OFFSET ...... ROWS FETCH NEXT ...仅在ORDER BY之后行

时间:2015-07-16 20:28:14

标签: sql sql-server-2012

我看到非常奇怪的构造行为,如

SELECT ... ORDER BY ... OFFSET ... ROWS FETCH NEXT ... ROWS ONLY 

我做了一个简单的例子来显示它(SQL Server版本:2012 - 11.0.5058.0(X64)):

CREATE TABLE #temp( c1 int NOT NULL, c2 varchar(MAX) NULL) 
INSERT INTO #temp (c1,c2) VALUES (1,'test1')
INSERT INTO #temp (c1,c2) VALUES (2,NULL)
INSERT INTO #temp (c1,c2) VALUES (3,'test3')
INSERT INTO #temp (c1,c2) VALUES (4,NULL)
INSERT INTO #temp (c1,c2) VALUES (5,NULL)

首先查询:

select * from #temp 
ORDER BY c2 DESC

结果还可以:

3   test3
1   test1
2   NULL
4   NULL
5   NULL

第二次查询:

select * from #temp 
ORDER BY c2 DESC
OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY

结果有另一种排序:

3   test3
1   test1
4   NULL

最后查询:

select * from #temp 
ORDER BY c2 DESC
OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY

结果是非常奇怪的,在我看来是无效的(我需要获得两个以前的结果中没有包含的记录,而是我得到id = 4次的记录):

4   NULL
2   NULL

有谁可以解释为什么SQL服务器如此奇怪?

1 个答案:

答案 0 :(得分:1)

在这种情况下使用唯一键列:

select * from #temp 
ORDER BY c2, c1 DESC
OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY

从未面临订购问题。