SELECT - ORDER BY-Klausel (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric
Sortiert von einer Abfrage in SQL Server zurückgegebene Daten. Verwenden Sie diese Klausel wie folgt:
Sortieren Sie das Resultset einer Abfrage anhand der angegebenen Spaltenliste und schränken Sie optional die für einen angegebenen Bereich zurückgegebenen Zeilen ein. Die Reihenfolge, in der Zeilen in einem Resultset zurückgegeben werden, werden nicht garantiert, es sei denn, eine
ORDER BY
Klausel wird angegeben.Bestimmen Sie die Reihenfolge, in der Werte der Rangfolgenfunktion auf das Resultset angewendet werden.
Transact-SQL-Syntaxkonventionen
Hinweis
ORDER BY
wird in SELECT
/INTO
Oder CREATE TABLE AS SELECT
(CTAS)-Anweisungen in Azure Synapse Analytics oder Analytics Platform System (PDW) nicht unterstützt.
Syntax
Syntax für SQL Server und Azure SQL-Datenbank
ORDER BY order_by_expression
[ COLLATE collation_name ]
[ ASC | DESC ]
[ , ...n ]
[ <offset_fetch> ]
<offset_fetch> ::=
{
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[
FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
]
}
Syntax für Azure Synapse Analytics und Parallel Data Warehouse.
[ ORDER BY
{
order_by_expression
[ ASC | DESC ]
} [ , ...n ]
]
Argumente
order_by_expression
Gibt eine Spalte oder einen Ausdruck an, anhand derer das Abfrageresultset sortiert werden soll. Eine Sortierspalte kann als Name oder Spaltenalias angegeben werden, oder eine nicht negative ganze Zahl, die die Position der Spalte in der Auswahlliste darstellt.
Es können mehrere Sortierspalten angegeben werden. Spaltennamen müssen eindeutig sein. Die Abfolge der Sortierspalten in der ORDER BY
Klausel definiert die Organisation des sortierten Resultsets. Dies bedeutet, dass das Resultset anhand der ersten Spalte sortiert wird, und diese sortierte Liste wird anhand der zweiten Spalte sortiert usw.
Die Spaltennamen, auf die in der ORDER BY
Klausel verwiesen wird, müssen entweder einem Spalten- oder Spaltenalias in der Auswahlliste oder einer spalte entsprechen, die in einer in der FROM
Klausel angegebenen Tabelle ohne Mehrdeutigkeiten definiert ist. Wenn die ORDER BY
Klausel auf einen Spaltenalias aus der Auswahlliste verweist, muss der Spaltenalias eigenständig und nicht als Teil eines Ausdrucks in ORDER BY
Klausel verwendet werden, z. B.:
SELECT SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
ORDER BY SchemaName; -- correct
SELECT SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
ORDER BY SchemaName + ''; -- wrong
COLLATE collation_name
Gibt an, dass der ORDER BY
Vorgang gemäß der in collation_name angegebenen Sortierung und nicht gemäß der Sortierung der Spalte gemäß der Definition in der Tabelle oder Ansicht ausgeführt werden soll. Die collation_name kann entweder ein Windows-Sortierungsname oder ein SQL-Sortierungsname sein. Weitere Informationen finden Sie unter Sortierungs- und Unicode-Support. COLLATE
gilt nur für Spalten vom Typ Char, varchar, nchar und nvarchar.
ASC | DESC
Gibt an, dass die Werte in der angegebenen Spalte in aufsteigender oder absteigender Reihenfolge sortiert werden sollen. ASC
sortiert vom niedrigsten Wert zum höchsten Wert. DESC
sortiert vom höchsten Wert zum niedrigsten Wert. ASC
ist die Standardsortierreihenfolge. NULL
-Werte werden als die niedrigsten möglichen Werte behandelt.
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
Gilt für: SQL Server 2012 (11.x) und höhere Versionen, Azure SQL-Datenbank und Azure SQL verwaltete Instanz.
Gibt die Anzahl der Zeilen an, die übersprungen werden soll, bevor Zeilen vom Abfrageausdruck zurückgegeben werden. Der Wert kann eine ganzzahlige Konstante oder ein Ausdruck größer oder gleich 0 sein.
offset_row_count_expression kann eine Variable, ein Parameter oder eine konstante skalare Unterabfrage sein. Wenn eine Unterabfrage verwendet wird, kann sie nicht auf spalten verweisen, die im äußeren Abfragebereich definiert sind. Das heißt, es kann nicht mit der äußeren Abfrage korreliert werden.
ROW
synonyme ROWS
und werden zur ANSI-Kompatibilität bereitgestellt.
In Abfrageausführungsplänen wird der Wert für die Offsetzeilenanzahl im Offset-Attribut des TOP
Abfrageoperators angezeigt.
FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
Gilt für: SQL Server 2012 (11.x) und höhere Versionen, Azure SQL-Datenbank und Azure SQL verwaltete Instanz.
Gibt die Anzahl der Zeilen an, die zurückgegeben werden sollen, nachdem die OFFSET
Klausel verarbeitet wurde. Der Wert kann eine ganzzahlige Konstante oder ein Ausdruck größer oder gleich 1 sein.
fetch_row_count_expression kann eine Variable, ein Parameter oder eine konstante skalare Unterabfrage sein. Wenn eine Unterabfrage verwendet wird, kann sie nicht auf spalten verweisen, die im äußeren Abfragebereich definiert sind. Das heißt, es kann nicht mit der äußeren Abfrage korreliert werden.
FIRST
synonyme NEXT
und werden zur ANSI-Kompatibilität bereitgestellt.
ROW
synonyme ROWS
und werden zur ANSI-Kompatibilität bereitgestellt.
In Abfrageausführungsplänen wird der Wert für die Offsetzeilenanzahl im Rows - oder Top-Attribut des TOP
Abfrageoperators angezeigt.
Bewährte Methoden
Vermeiden Sie die Angabe ganzzahliger Zahlen in der ORDER BY
Klausel als positionale Darstellungen der Spalten in der Auswahlliste. Obwohl beispielsweise eine Anweisung wie SELECT ProductID, Name FROM Production.Production ORDER BY 2
gültig ist, ist die Anweisung nicht so leicht zu verstehen, wie sie mit der Angabe des tatsächlichen Spaltennamens verglichen wird. Darüber hinaus müssen Änderungen an der Auswahlliste, z. B. das Ändern der Spaltenreihenfolge oder das Hinzufügen neuer Spalten, die ORDER BY
Klausel ändern, um unerwartete Ergebnisse zu vermeiden.
Verwenden Sie in einer SELECT TOP (<n>)
Anweisung immer eine ORDER BY
Klausel. Dies ist die einzige Möglichkeit, vorhersagbar anzugeben, von TOP
welchen Zeilen betroffen sind. Weitere Informationen finden Sie unter TOP.
Interoperabilität
Wenn sie mit einer oder INSERT...SELECT
einer SELECT...INTO
Anweisung verwendet wird, um Zeilen aus einer anderen Quelle einzufügen, garantiert die ORDER BY
Klausel nicht, dass die Zeilen in der angegebenen Reihenfolge eingefügt werden.
Die Verwendung OFFSET
und FETCH
in einer Ansicht ändert die Aktualisierungseigenschaft der Ansicht nicht.
Begrenzungen
Es gibt keine Beschränkung auf die Anzahl der Spalten in der ORDER BY
Klausel. Die Gesamtgröße der in einer ORDER BY
Klausel angegebenen Spalten darf jedoch 8.060 Bytes nicht überschreiten.
Spalten vom Typ ntext, Text, Bild, Geografie, Geometrie und XML können nicht in einer ORDER BY
Klausel verwendet werden.
Eine ganze Zahl oder Konstante kann nicht angegeben werden, wenn order_by_expression in einer Bewertungsfunktion angezeigt wird. Weitere Informationen finden Sie unter SELECT - OVER-Klausel.
Wenn ein Tabellenname in der FROM
Klausel aliast ist, kann nur der Aliasname verwendet werden, um seine Spalten in der ORDER BY
Klausel zu qualifizieren.
Spaltennamen und Aliase, die in der ORDER BY
Klausel angegeben sind, müssen in der Auswahlliste definiert werden, wenn die SELECT
Anweisung eine der folgenden Klauseln oder Operatoren enthält:
UNION
-OperatorEXCEPT
-OperatorINTERSECT
-OperatorSELECT DISTINCT
Wenn die Anweisung außerdem einen UNION
, EXCEPT
oder INTERSECT
Operator enthält, müssen die Spaltennamen oder Spaltenaliasen in der Auswahlliste der ersten Abfrage (linksbündig) angegeben werden.
In einer Abfrage, die UNION
operatoren EXCEPT
verwendet INTERSECT
ORDER BY
, ist nur am Ende der Anweisung zulässig. Diese Einschränkung gilt nur, wenn Sie eine EXCEPT
Abfrage auf oberster Ebene und INTERSECT
nicht in einer Unterabfrage angebenUNION
. Siehe den folgenden Abschnitt "Beispiele ".
Die ORDER BY
Klausel ist in Ansichten, Inlinefunktionen, abgeleiteten Tabellen und Unterabfragen nicht gültig, es sei denn, die TOP
Klauseln oder OFFSET
Klauseln FETCH
werden ebenfalls angegeben. Wenn ORDER BY
sie in diesen Objekten verwendet wird, wird die Klausel nur verwendet, um die zeilen zu bestimmen, die von der TOP
Klausel oder OFFSET
FETCH
Klausel zurückgegeben werden. Die ORDER BY
Klausel garantiert keine sortierten Ergebnisse, wenn diese Konstrukte abgefragt werden, es sei denn ORDER BY
, sie werden auch in der Abfrage selbst angegeben.
OFFSET
und FETCH
werden in indizierten Ansichten oder in einer Ansicht, die mithilfe der CHECK OPTION
Klausel definiert wird, nicht unterstützt.
OFFSET
und FETCH
kann in jeder Abfrage verwendet werden, die die folgenden Einschränkungen zulässt TOP
und ORDER BY
die folgenden Einschränkungen zulässt:
Die
OVER
Klausel unterstütztOFFSET
und unterstützt nichtFETCH
.OFFSET
undFETCH
kann nicht direkt inINSERT
,UPDATE
, ,MERGE
undDELETE
Anweisungen angegeben werden, aber in einer Unterabfrage angegeben werden, die in diesen Anweisungen definiert ist. Beispiel: In derINSERT INTO SELECT
AnweisungOFFSET
undFETCH
kann in derSELECT
Anweisung angegeben werden.In einer Abfrage, die
UNION
operatorenEXCEPT
verwendet undINTERSECT
FETCH
nur in der endgültigen Abfrage angegeben werden kann,OFFSET
die die Reihenfolge der Abfrageergebnisse angibt.TOP
kann nicht mitOFFSET
undFETCH
im gleichen Abfrageausdruck (im gleichen Abfragebereich) kombiniert werden.
Verwenden von OFFSET und FETCH zum Einschränken der zurückgegebenen Zeilen
Sie sollten anstelle der TOP
Klausel die OFFSET
Klausel FETCH
verwenden, um eine Abfrage paging-Lösung zu implementieren und die Anzahl der Zeilen zu begrenzen, die an eine Clientanwendung gesendet werden.
Für die Verwendung OFFSET
und FETCH
als Auslagerungslösung muss die Abfrage für jede Datenseite , die an die Clientanwendung zurückgegeben wird, einmal ausgeführt werden. Um beispielsweise die Ergebnisse einer Abfrage in 10 Zeilenschritten zurückzugeben, müssen Sie die Abfrage einmal ausführen, um Zeilen 1 bis 10 zurückzugeben, und dann die Abfrage erneut ausführen, um Zeilen 11 bis 20 zurückzugeben usw. Jede Abfrage ist unabhängig und weist keinen Bezug zur anderen auf. Dies bedeutet, dass im Gegensatz zur Verwendung eines Cursors, bei dem die Abfrage einmal ausgeführt und der Status auf dem Server beibehalten wird, die Clientanwendung für das Nachverfolgen des Status zuständig ist. Um stabile Ergebnisse zwischen Abfrageanforderungen zu erzielen, müssen OFFSET
FETCH
die folgenden Bedingungen erfüllt sein:
Die zugrunde liegenden Daten, die von der Abfrage verwendet werden, dürfen sich nicht ändern. Das heißt, die zeilen, die von der Abfrage berührt werden, werden nicht aktualisiert, oder alle Anforderungen für Seiten aus der Abfrage werden in einer einzigen Transaktion mithilfe von Snapshot- oder serialisierbarer Transaktionsisolation ausgeführt. Weitere Informationen zu diesen Transaktionsisolationsstufen finden Sie unter SET TRANSACTION ISOLATION LEVEL.
Die
ORDER BY
Klausel enthält eine Spalte oder Eine Kombination von Spalten, die garantiert eindeutig sind.
Weitere Informationen finden Sie im Beispiel "Ausführen mehrerer Abfragen in einer einzelnen Transaktion" im Abschnitt "Beispiele" weiter unten in diesem Artikel.
Wenn konsistente Ausführungspläne in Ihrer Auslagerungslösung wichtig sind, sollten Sie die OPTIMIZE FOR
Abfragehinweise für die und FETCH
die OFFSET
Parameter verwenden. Siehe Angeben von Ausdrücken für OFFSET- und FETCH-Werte im Abschnitt "Beispiele " weiter unten in diesem Artikel. Weitere Informationen finden OPTIMIZE FOR
Sie unter Abfragehinweise.
Beispiele
Die Transact-SQL-Codebeispiele in diesem Artikel verwenden die AdventureWorks2022
- oder AdventureWorksDW2022
-Beispieldatenbank, die Sie von der Homepage Microsoft SQL Server Samples and Community Projects herunterladen können.
Kategorie | Funktionssyntaxelemente |
---|---|
Grundlegende Syntax | ORDER BY |
Aufsteigende und absteigende Reihenfolge angeben | DESC oder ASC |
Angeben einer Sortierung | COLLATE |
Angeben einer bedingten Reihenfolge | CASE -Ausdruck |
Verwenden von ORDER BY in einer Bewertungsfunktion | Rangfolgefunktionen |
Beschränken der Anzahl der zurückgegebenen Zeilen | OFFSET und FETCH |
VERWENDEN VON ORDER BY mit UNION, EXCEPT und INTERSECT | UNION |
Grundlegende Syntax
Beispiele in diesem Abschnitt veranschaulichen die grundlegenden Funktionen der ORDER BY
Klausel mithilfe der minimal erforderlichen Syntax.
A. Angeben einer einzelnen Spalte, die in der Auswahlliste definiert ist
Im folgenden Beispiel wird das Resultset anhand der numerischen ProductID
-Spalte sortiert. Da keine bestimmte Sortierreihenfolge angegeben ist, wird die Standardreihenfolge (aufsteigende Reihenfolge) verwendet.
USE AdventureWorks2022;
GO
SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID;
B. Angeben einer Spalte, die in der Auswahlliste nicht definiert ist
Im folgenden Beispiel wird das Resultset nach einer Spalte sortiert, die nicht in der Auswahlliste enthalten ist, aber in der in der FROM
Klausel angegebenen Tabelle definiert ist.
USE AdventureWorks2022;
GO
SELECT ProductID, Name, Color
FROM Production.Product
ORDER BY ListPrice;
C. Angeben eines Alias als Sortierspalte
Im folgenden Beispiel wird der Spaltenalias SchemaName
als Sortierspalte angegeben.
USE AdventureWorks2022;
GO
SELECT name, SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
WHERE type = 'U'
ORDER BY SchemaName;
D: Angeben eines Ausdrucks als Sortierspalte
Im folgenden Beispiel wird ein Ausdruck als Sortierspalte verwendet. Der Ausdruck wird mithilfe der DATEPART
Funktion definiert, um das Resultset nach dem Jahr zu sortieren, in dem Mitarbeiter eingestellt wurden.
USE AdventureWorks2022;
GO
SELECT BusinessEntityID, JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY DATEPART(year, HireDate);
Aufsteigende und absteigende Sortierreihenfolge angeben
A. Angeben einer absteigenden Reihenfolge
Im folgenden Beispiel wird das Resultset anhand der numerischen ProductID
-Spalte in absteigender Reihenfolge sortiert.
USE AdventureWorks2022;
GO
SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID DESC;
B. Angeben einer aufsteigenden Reihenfolge
Im folgenden Beispiel wird das Resultset anhand der Name
-Spalte in aufsteigender Reihenfolge sortiert. Die Zeichen sind alphabetisch und nicht numerisch sortiert. Das heißt, 10 steht in der Sortierreihenfolge vor 2.
USE AdventureWorks2022;
GO
SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY Name ASC;
C. Angeben von aufsteigender und absteigender Reihenfolge
Im folgenden Beispiel wird das Resultset anhand von zwei Spalten sortiert. Das Abfrageresultset wird zunächst anhand der FirstName
-Spalte in aufsteigender und anschließend anhand der LastName
-Spalte in absteigender Reihenfolge sortiert.
USE AdventureWorks2022;
GO
SELECT LastName, FirstName
FROM Person.Person
WHERE LastName LIKE 'R%'
ORDER BY FirstName ASC, LastName DESC;
Angeben einer Sortierung
Das folgende Beispiel zeigt, wie das Angeben einer Sortierung in der ORDER BY
Klausel die Reihenfolge ändern kann, in der die Abfrageergebnisse zurückgegeben werden. Es wird eine Tabelle mit einer Spalte erstellt, bei deren Sortierung weder die Groß- und Kleinschreibung beachtet noch nach Akzent unterschieden wird. Werte werden mit unterschiedlichen Groß- und Kleinschreibungs- und Akzentunterschieden eingefügt. Da in der ORDER BY
Klausel keine Sortierung angegeben ist, verwendet die erste Abfrage beim Sortieren der Werte die Sortierung der Spalte. In der zweiten Abfrage wird eine Sortierung zwischen Groß- und Kleinschreibung und Akzent vertraulich in der ORDER BY
Klausel angegeben, wodurch die Reihenfolge geändert wird, in der die Zeilen zurückgegeben werden.
USE tempdb;
GO
CREATE TABLE #t1 (name NVARCHAR(15) COLLATE Latin1_General_CI_AI);
GO
INSERT INTO #t1
VALUES (N'Sánchez'),
(N'Sanchez'),
(N'sánchez'),
(N'sanchez');
-- This query uses the collation specified for the column 'name' for sorting.
SELECT name
FROM #t1
ORDER BY name;
-- This query uses the collation specified in the ORDER BY clause for sorting.
SELECT name
FROM #t1
ORDER BY name COLLATE Latin1_General_CS_AS;
Angeben einer bedingten Reihenfolge
In den folgenden Beispielen wird der CASE
Ausdruck in einer ORDER BY
Klausel verwendet, um die Sortierreihenfolge der Zeilen basierend auf einem bestimmten Spaltenwert bedingt zu bestimmen. Im ersten Beispiel wird der Wert in der SalariedFlag
-Spalte der HumanResources.Employee
-Tabelle ausgewertet. Mitarbeiter, deren SalariedFlag
auf 1 festgelegt wurde, werden nach BusinessEntityID
in absteigender Folge zurückgegeben. Mitarbeiter, deren SalariedFlag
auf 0 festgelegt wurde, werden nach BusinessEntityID
in aufsteigender Folge zurückgegeben. Im zweiten Beispiel wird das Resultset nach der TerritoryName
-Spalte sortiert, wenn die CountryRegionName
-Spalte gleich 'United States' ist, und bei allen anderen Zeilen nach CountryRegionName
.
SELECT BusinessEntityID,
SalariedFlag
FROM HumanResources.Employee
ORDER BY
CASE SalariedFlag
WHEN 1 THEN BusinessEntityID
END DESC,
CASE
WHEN SalariedFlag = 0 THEN BusinessEntityID
END;
GO
SELECT BusinessEntityID,
LastName,
TerritoryName,
CountryRegionName
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL
ORDER BY
CASE CountryRegionName
WHEN 'United States' THEN TerritoryName
ELSE CountryRegionName
END;
Verwenden von ORDER BY in einer Bewertungsfunktion
Im folgenden Beispiel wird die ORDER BY
Klausel in den Rangfolgenfunktionen ROW_NUMBER
, , RANK
, DENSE_RANK
und NTILE
.
USE AdventureWorks2022;
GO
SELECT p.FirstName,
p.LastName,
ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number",
RANK() OVER (ORDER BY a.PostalCode) AS "Rank",
DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank",
NTILE(4) OVER (ORDER BY a.PostalCode) AS "Quartile",
s.SalesYTD,
a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;
Beschränken der Anzahl der zurückgegebenen Zeilen
Gilt für: SQL Server 2012 (11.x) und höhere Versionen, Azure SQL-Datenbank und Azure SQL verwaltete Instanz.
In den folgenden Beispielen wird die Anzahl der zeilen, die von einer Abfrage zurückgegeben werden, verwendet OFFSET
und FETCH
beschränkt.
A. Angeben ganzzahliger Konstanten für OFFSET- und FETCH-Werte
Im folgenden Beispiel wird eine ganze Zahl als Wert für die OFFSET
Und-Klauseln FETCH
angegeben. Die erste Abfrage gibt alle Zeilen nach der DepartmentID
-Spalte sortiert zurück. Vergleichen Sie die von dieser Abfrage zurückgegebenen Ergebnisse mit denen der beiden folgenden Abfragen. Die nächste Abfrage verwendet die Klausel OFFSET 5 ROWS
, um die ersten fünf Zeilen zu überspringen und alle verbleibenden Zeilen zurückzugeben. In der letzten Abfrage wird mit der OFFSET 0 ROWS
-Klausel bei der ersten Zeile begonnen, und anschließend wird mit FETCH NEXT 10 ROWS ONLY
die Anzahl der zurückgegebenen Zeilen vom sortierten Resultset auf 10 begrenzt.
USE AdventureWorks2022;
GO
-- Return all rows sorted by the column DepartmentID.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID;
-- Skip the first 5 rows from the sorted result set and return all remaining rows.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID OFFSET 5 ROWS;
-- Skip 0 rows and return only the first 10 rows from the sorted result set.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;
B. Angeben von Variablen für OFFSET- und FETCH-Werte
Im folgenden Beispiel werden die Variablen @RowsToSkip
deklariert und @FetchRows
diese Variablen in den OFFSET
Und-Klauseln FETCH
angegeben.
USE AdventureWorks2022;
GO
-- Specifying variables for OFFSET and FETCH values
DECLARE
@RowsToSkip TINYINT = 2,
@FetchRows TINYINT = 8;
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC OFFSET @RowsToSkip ROWS
FETCH NEXT @FetchRows ROWS ONLY;
C. Angeben von Ausdrücken für OFFSET- und FETCH-Werte
Im folgenden Beispiel wird der Ausdruck @StartingRowNumber - 1
verwendet, um den OFFSET
Wert und den Ausdruck @EndingRowNumber - @StartingRowNumber + 1
anzugeben, um den FETCH-Wert anzugeben. Darüber hinaus wird der Abfragehinweis angegeben OPTIMIZE FOR
. Mit dem Abfragehinweis kann ein bestimmter Wert für eine lokale Variable bereitgestellt werden, wenn die Abfrage kompiliert und optimiert wird. Dieser Wert wird nur während der Abfrageoptimierung verwendet, nicht während der Abfrageausführung. Weitere Informationen finden Sie unter Abfragehinweise.
USE AdventureWorks2022;
GO
-- Specifying expressions for OFFSET and FETCH values
DECLARE
@StartingRowNumber TINYINT = 1,
@EndingRowNumber TINYINT = 8;
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC OFFSET @StartingRowNumber - 1 ROWS
FETCH NEXT @EndingRowNumber - @StartingRowNumber + 1 ROWS ONLY
OPTION (OPTIMIZE FOR (@StartingRowNumber = 1, @EndingRowNumber = 20));
D: Angeben einer konstanten skalaren Unterabfrage für OFFSET- und FETCH-Werte
Im folgenden Beispiel wird eine konstante skalare Unterabfrage verwendet, um den Wert für die FETCH
Klausel zu definieren. Die Unterabfrage gibt einen einzelnen Wert von der Spalte PageSize
in der Tabelle dbo.AppSettings
zurück.
-- Specifying a constant scalar subquery
USE AdventureWorks2022;
GO
CREATE TABLE dbo.AppSettings (
AppSettingID INT NOT NULL,
PageSize INT NOT NULL
);
GO
INSERT INTO dbo.AppSettings
VALUES (1, 10);
GO
DECLARE @StartingRowNumber TINYINT = 1;
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC OFFSET @StartingRowNumber ROWS
FETCH NEXT (
SELECT PageSize
FROM dbo.AppSettings
WHERE AppSettingID = 1
) ROWS ONLY;
E. Ausführen mehrerer Abfragen in einer einzelnen Transaktion
Im folgenden Beispiel wird eine Methode veranschaulicht, eine Auslagerungslösung zu implementieren, die sicherstellt, dass in allen Anforderungen beständige Ergebnisse von der Abfrage zurückgegeben werden. Die Abfrage wird in einer einzelnen Transaktion mithilfe der Snapshotisolationsstufe ausgeführt, und die in der ORDER BY
Klausel angegebene Spalte stellt die Eindeutigkeit der Spalten sicher.
USE AdventureWorks2022;
GO
-- Ensure the database can support the snapshot isolation level set for the query.
IF (
SELECT snapshot_isolation_state
FROM sys.databases
WHERE name = N'AdventureWorks2022'
) = 0
ALTER DATABASE AdventureWorks2022
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO
-- Set the transaction isolation level to SNAPSHOT for this query.
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
GO
-- Beginning the transaction.
BEGIN TRANSACTION;
GO
-- Declare and set the variables for the OFFSET and FETCH values.
DECLARE
@StartingRowNumber INT = 1,
@RowCountPerPage INT = 3;
-- Create the condition to stop the transaction after all rows have been returned.
WHILE (
SELECT COUNT(*)
FROM HumanResources.Department
) >= @StartingRowNumber
BEGIN
-- Run the query until the stop condition is met.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC OFFSET @StartingRowNumber - 1 ROWS
FETCH NEXT @RowCountPerPage ROWS ONLY;
-- Increment @StartingRowNumber value.
SET @StartingRowNumber = @StartingRowNumber + @RowCountPerPage;
CONTINUE
END;
GO
COMMIT TRANSACTION;
GO
VERWENDEN VON ORDER BY mit UNION, EXCEPT und INTERSECT
Wenn eine Abfrage die UNION
, EXCEPT
oder INTERSECT
Operatoren verwendet, muss die ORDER BY
Klausel am Ende der Anweisung angegeben werden, und die Ergebnisse der kombinierten Abfragen werden sortiert. Im folgenden Beispiel werden alle Produkte zurückgegeben, die rot oder gelb sind, und die kombinierte Liste wird anhand der Spalte ListPrice
sortiert.
USE AdventureWorks2022;
GO
SELECT Name, Color, ListPrice
FROM Production.Product
WHERE Color = 'Red'
-- ORDER BY cannot be specified here.
UNION ALL
SELECT Name, Color, ListPrice
FROM Production.Product
WHERE Color = 'Yellow'
ORDER BY ListPrice ASC;
Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)
Das folgende Beispiel veranschaulicht ein Resultset sortiert nach der numerischen EmployeeKey
-Spalte in aufsteigender Reihenfolge.
-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY EmployeeKey;
Im folgenden Beispiel wird ein Resultset anhand der numerischen EmployeeKey
-Spalte in absteigender Reihenfolge sortiert.
-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY EmployeeKey DESC;
Im folgenden Beispiel wird das Resultset anhand der LastName
-Spalte sortiert.
-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY LastName;
Im folgenden Beispiel wird das Resultset anhand von zwei Spalten sortiert. In dieser Abfrage wird zuerst nach der FirstName
-Spalte in aufsteigender Reihenfolge sortiert, und anschließend werden FirstName
-Werte nach der LastName
-Spalte in absteigender Reihenfolge sortiert.
-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY LastName, FirstName;