如何在SQL Server中使用OFFSET和Fetch without Order by

Moh*_*وسی 14 sql-server sql-order-by fetch offset sql-server-2012

我想在我的SQL server 2012查询中使用OFFSET和Fetch.但没有任何顺序.我不能使用order by.Because我的排序顺序将丢失.我如何使用OFFSET和Fetch没有order by和行号以及我的查询中的位置?我的2个选择表具有相同的结构.

INSERT INTO @TempTable [some columns]  
select [some columns] from table1 order by col1 
INSERT INTO @TempTable [same columns]
select [some columns] from table2 order by col2
select * from @TempTable OFFSET 20 ROWS FETCH NEXT 50 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

此查询在OFFSET关键字处有语法错误.

小智 33

有一种更简单的方法来提供虚拟ORDER BY子句:

select * from @TempTable ORDER BY(SELECT NULL) OFFSET 20 ROWS FETCH NEXT 50 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

  • 你是一个 SQL 忍者! (3认同)
  • 我发现这会导致查询之间的顺序不一致。因此,如果您使用它进行分页,您可能会获得同一行两次,等等。 (2认同)

小智 16

您无法避免使用ORDER BY和OFFSET和FETCH所需的语法.

但是,可以取消关联您必须提供的ORDER BY子句,以便从记录插入过程创建的自然表顺序执行分页.

使用下面的解决方案,您不必对基础表进行任何更改

Select 0 as TempSort, T.* From MyTable T ORDER BY TempSort OFFSET 2 ROWS FETCH NEXT 3 ROWS
Run Code Online (Sandbox Code Playgroud)


Me.*_*ame 8

通过向临时表变量添加标识列

    declare @TempTable table([some columns], rownr int identity(1,1) )

    INSERT INTO @TempTable [some columns]  
    select [some columns] from table1  order by col1 

    INSERT INTO @TempTable [same columns]
    select [some columns] from table2 order by col2
Run Code Online (Sandbox Code Playgroud)

为每一行添加一个自动递增的数字,按照它们添加到临时表的顺序.插入物不需要填充此列,因此插入物可以保持原样.然后可以通过以下方式将标识列用于订单:

 select * from @TempTable Order by rownr OFFSET 20 ROWS FETCH NEXT 50 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)