it-swarm.com.de

Verwendung von OFFSET und Fetch without Order by in SQL Server

Ich möchte OFFSET und Fetch in meiner SQL Server 2012-Abfrage verwenden. Aber ohne eine Reihenfolge von. Ich kann keine Reihenfolge von verwenden. Weil meine Sortierreihenfolge verloren geht. Wie kann ich OFFSET und Fetch ohne Bestellung nach und Zeilennummer verwenden und wo in meiner Anfrage? Meine 2 Auswahltabellen haben die gleiche Struktur.

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

Diese Abfrage weist einen Syntaxfehler beim Schlüsselwort OFFSET auf.

12

Durch Hinzufügen einer Identitätsspalte zur temporären Tabellenvariablen

    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

Für jede Zeile wird eine automatische Inkrementierungsnummer in der Reihenfolge hinzugefügt, in der sie der temporären Tabelle hinzugefügt wurden. Die Einfügungen müssen diese Spalte nicht füllen, damit die Einfügungen unverändert bleiben können. Die Identitätsspalte kann dann für die Bestellung verwendet werden von:

 select * from @TempTable Order by rownr OFFSET 20 ROWS FETCH NEXT 50 ROWS ONLY
7
Me.Name

Es gibt eine noch einfachere Möglichkeit, eine Dummy-ORDER BY-Klausel bereitzustellen:

select * from @TempTable ORDER BY(SELECT NULL) OFFSET 20 ROWS FETCH NEXT 50 ROWS ONLY
19
Jörg

Sie können es nicht vermeiden, die erforderliche Syntax eines ORDER BY mit OFFSET und FETCH zu verwenden.

Es ist jedoch möglich, die von Ihnen angegebene ORDER BY-Klausel von der natürlichen Tabellenreihenfolge zu trennen, die beim Einfügen von Datensätzen erstellt wurde.

Mit der folgenden Lösung müssen Sie auch keine Änderungen an der zugrunde liegenden Tabelle vornehmen

Select 0 as TempSort, T.* From MyTable T ORDER BY TempSort OFFSET 2 ROWS FETCH NEXT 3 ROWS
13
pixelda

Offset/Fetch erfordert eine Order by-Klausel. Sie können CURRENT_TIMESTAMP verwenden, um diese Anforderung zu umgehen, wenn Sie keine Bestellung aufgeben möchten. Ich bin nicht sicher, aber dies sollte Zeilen basierend auf der Reihenfolge des Speichers zurückgeben (Clustered-Index möglicherweise)

Wenn Sie also Ihren Code auf diesen ändern, sollte das Problem behoben sein -

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 **order by current_timestamp** OFFSET 20 ROWS FETCH NEXT 50 ROWS ONLY
0
Diptiman Singh

Nach Recherchen und Kommentaren zufolge lautet die klare und zusammenfassende Antwort: "Es gibt keinen Weg!"

Sie können jedoch Ihre Sortierreihenfolge mit row_number () beibehalten. Daher habe ich eine neue getestete Abfrage bereitgestellt, die die Sortierreihenfolge der temporären Tabelle (Final Table) mit den Klauseln OFFSET und FETCH beibehält.

    INSERT INTO @TempTable [some columns]  
    select [some columns],row_number() OVER (order by col1) row from table1 order by col1 

    declare @maxrow int
    select @maxrow=max(rn) from @TempTable

    INSERT INTO @TempTable [same columns]
    select [some columns],((row_number() OVER (order by col2)) + @maxrow) row from table2 order by col2

    select * from @TempTable Order by row  OFFSET 20 ROWS FETCH NEXT 50 ROWS ONLY
0