it-swarm.com.de

Wie implementiere ich LIMIT mit Microsoft SQL Server?

Ich habe diese Abfrage mit MySQL: 

select * from table1 LIMIT 10,20

Wie kann ich das mit Microsoft SQL machen?

106
Bigballs

Ab SQL Server 2005 können Sie dies tun ...

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 10 AND 20;

oder so etwas für 2000 und darunter Versionen ...

SELECT TOP 10 * FROM (SELECT TOP 20 FROM Table ORDER BY Id) ORDER BY Id DESC
105
Leon Tayson

Klobig, aber es wird funktionieren.

SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 10 id FROM table ORDER BY id) FROM table ORDER BY id

Die Auslassung einer LIMIT-Klausel durch MSSQL ist kriminell, IMO. Sie sollten nicht so eine kluge Abhilfe schaffen müssen.

47
ceejayoz

Ab SQL SERVER 2012 können Sie die Klausel OFFSET FETCH verwenden:

USE AdventureWorks;
GO
SELECT SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader 
ORDER BY SalesOrderID
    OFFSET 10 ROWS
    FETCH NEXT 10 ROWS ONLY;
GO

http://msdn.Microsoft.com/de-de/library/ms188385(v=sql.110).aspx

Dies funktioniert möglicherweise nicht richtig, wenn die Bestellung nicht eindeutig ist.

Wenn die Abfrage in ORDER BY OrderDate geändert wird, ist die zurückgegebene Ergebnismenge nicht wie erwartet.

24
user4047259

Dies ist fast ein Duplikat einer Frage, die ich im Oktober gestellt hatte: Emulate MySQL LIMIT-Klausel in Microsoft SQL Server 2000

Wenn Sie Microsoft SQL Server 2000 verwenden, gibt es keine gute Lösung. Die meisten Benutzer müssen das Ergebnis der Abfrage in einer temporären Tabelle mit einem IDENTITY-Primärschlüssel erfassen. Fragen Sie dann mit der BETWEEN-Bedingung gegen die Primärschlüsselspalte ab.

Wenn Sie Microsoft SQL Server 2005 oder höher verwenden, verfügen Sie über eine Funktion ROW_NUMBER(). Sie können also dasselbe Ergebnis erzielen, die temporäre Tabelle jedoch vermeiden.

SELECT t1.*
FROM (
    SELECT ROW_NUMBER OVER(ORDER BY id) AS row, t1.*
    FROM ( ...original SQL query... ) t1
) t2
WHERE t2.row BETWEEN @offset+1 AND @[email protected];

Sie können dies auch als common table expression schreiben, wie in @Leon Taysons answer gezeigt.

18
Bill Karwin
SELECT  *
FROM    (
        SELECT  TOP 20
                t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
        FROM    table1 t
        ORDER BY
                field1
        ) t
WHERE   rn > 10
12
Quassnoi

So beschränke ich die Ergebnisse in MS SQL Server 2012

SELECT * 
FROM table1
ORDER BY columnName
  OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

HINWEIS: OFFSET kann nur zusammen mit ORDER BY verwendet werden.

Zur Erläuterung der Codezeile OFFSET xx ROWS FETCH NEXT yy ROW NUR

Das "xx" ist die Datensatz-/Zeilennummer, aus der die Tabelle abgerufen werden soll .
IE: Wenn in Tabelle 1 40 Datensätze vorhanden sind. Der obige Code beginnt aus Zeile 10 zu ziehen.

Das "yy" ist die Anzahl der Datensätze/Zeilen, die Sie aus der Tabelle ziehen möchten.
Um auf dem vorherigen Beispiel zu bauen. 
IE: Wenn Tabelle 1 40 Datensätze hat und Sie aus Zeile 10 gezogen haben und den nächsten Satz von 10 (yy) verwenden. 
Das würde bedeuten, dass der obige Code die Datensätze von Tabelle 1 ab Zeile 10 abschließt und bei 20 endet. Dadurch werden die Zeilen 10 - 20 gezogen.

Checke den Link für weitere Informationen zu OFFSET

11
Jeremy

Syntactically MySQL LIMIT-Abfrage lautet ungefähr so:

SELECT * FROM table LIMIT OFFSET, ROW_COUNT

Dies kann gerne in Microsoft SQL Server übersetzt werden

SELECT * FROM 
(
    SELECT TOP #{OFFSET+ROW_COUNT} *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum 
    FROM table
) a
WHERE rnum > OFFSET

Nun wird Ihre Abfrage select * from table1 LIMIT 10,20 so sein:

SELECT * FROM 
(
    SELECT TOP 30 *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum 
    FROM table1
) a
WHERE rnum > 10 
8
user1134160

Dies ist einer der Gründe, warum ich versuche, MS Server zu verwenden, aber trotzdem. Manchmal haben Sie einfach keine Option (yei! Und ich muss eine veraltete Version verwenden !!).

Mein Vorschlag ist, eine virtuelle Tabelle zu erstellen:

Von:

SELECT * FROM table

Zu:

CREATE VIEW v_table AS    
    SELECT ROW_NUMBER() OVER (ORDER BY table_key) AS row,* FROM table

Dann einfach abfragen:

SELECT * FROM v_table WHERE row BETWEEN 10 AND 20

Wenn Felder hinzugefügt oder entfernt werden, wird "Zeile" automatisch aktualisiert.

Das Hauptproblem bei dieser Option ist, dass ORDER BY behoben wird. Wenn Sie also eine andere Reihenfolge wünschen, müssen Sie eine andere Ansicht erstellen.

UPDATE

Bei diesem Ansatz gibt es ein weiteres Problem: Wenn Sie versuchen, Ihre Daten zu filtern, funktionieren diese nicht wie erwartet. Wenn Sie beispielsweise Folgendes tun: 

SELECT * FROM v_table WHERE field = 'test' AND row BETWEEN 10 AND 20

WHERE wird auf diejenigen Daten beschränkt, die in den Zeilen zwischen 10 und 20 liegen (anstatt den gesamten Datensatz zu durchsuchen und die Ausgabe zu begrenzen).

2
lepe
SELECT 
    * 
FROM 
    (
        SELECT 
            top 20              -- ($a) number of records to show
            * 
        FROM
            (
                SELECT 
                    top 29      -- ($b) last record position
                    * 
                FROM 
                    table       -- replace this for table name (i.e. "Customer")
                ORDER BY 
                    2 ASC
            ) AS tbl1 
        ORDER BY 
            2 DESC
    ) AS tbl2 
ORDER BY 
    2 ASC;

-- Examples:

-- Show 5 records from position 5:
-- $a = 5;
-- $b = (5 + 5) - 1
-- $b = 9;

-- Show 10 records from position 4:
-- $a = 10;
-- $b = (10 + 4) - 1
-- $b = 13;

-- To calculate $b:
-- $b = ($a + position) - 1

-- For the present exercise we need to:
-- Show 20 records from position 10:
-- $a = 20;
-- $b = (20 + 10) - 1
-- $b = 29;
1
Julian Moreno

Dies ist ein mehrstufiger Ansatz, der in SQL2000 funktionieren wird.

-- Create a temp table to hold the data
CREATE TABLE #foo(rowID int identity(1, 1), myOtherColumns)

INSERT INTO #foo (myColumns) SELECT myData order By MyCriteria

Select * FROM #foo where rowID > 10
1
souLTower

verwenden Sie dies besser in MSSQLExpress 2017.

SELECT * FROM
(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) as [Count], * FROM table1
) as a
WHERE [Count] BETWEEN 10 and 20;

- Geben Sie eine Spalte [Count] und weisen Sie jeder Zeile eine eindeutige Zählung zu, ohne etwas zu bestellen. Wählen Sie dann erneut, wo Sie Ihre Grenzen angeben können. :)

0
user1308314

In SQL gibt es kein LIMIT-Schlüsselwort. Wenn Sie nur eine begrenzte Anzahl von Zeilen benötigen, sollten Sie ein TOP-Schlüsselwort verwenden, das einem LIMIT ähnelt.

0
Mitul Panchal

Müssen versuchen. In der folgenden Abfrage können Sie Gruppieren nach, Sortieren nach, Zeilen überspringen und Zeilen begrenzen.

select emp_no , sum(salary_amount) from emp_salary
Group by emp_no 
ORDER BY emp_no 
OFFSET 5 ROWS       -- Skip first 5 
FETCH NEXT 10 ROWS ONLY; -- limit to retrieve next 10 row after skiping rows
0
M Danish

Wenn Ihre ID ein eindeutiger Bezeichner ist oder Ihre ID in der Tabelle nicht sortiert ist, müssen Sie dies wie folgt tun.

select * from
(select ROW_NUMBER() OVER (ORDER BY (select 0)) AS RowNumber,* from table1) a
where a.RowNumber between 2 and 5



Der Code wird sein 

wählen Sie * aus Limit 2,5 aus
0
user3244012