|
Dieser Artikel wurde manuell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen.
|
Übersetzung
Original
|
ORDER BY-Klausel (Transact-SQL)
-
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, ist 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.
-
UNION-Operator -
EXCEPT-Operator -
INTERSECT-Operator -
SELECT DISTINCT
-
Die OVER-Klausel unterstützt OFFSET und FETCH nicht. -
OFFSET und FETCH können in Anweisungen INSERT, UPDATE, MERGE, und DELETE nicht direkt angegeben werden, sondern müssen in eine entsprechende Unterabfrage eingeschlossen werden. Beispielsweise können OFFSET und FETCH in der INSERT INTO SELECT-Anweisung in die SELECT-Anweisung eingeschlossen werden. -
In einer Abfrage, die die Operatoren UNION, EXCEPT oder INTERSECT verwendet, können OFFSET und FETCH nur in die abschließende Abfrage eingeschlossen werden, die die Reihenfolge der Abfrageergebnisse angibt. -
TOP kann nicht mit OFFSET und FETCH im gleichen Abfrageausdruck (im gleichen Abfragebereich) kombiniert werden.
-
Die zugrunde liegenden Daten, die von der Abfrage verwendet werden, dürfen sich nicht ändern. Dies bedeutet, dass die von der Abfrage erfassten Zeilen nicht aktualisiert werden oder alle Anforderungen für Seiten von der Abfrage mit einer Momentaufnahme in einer einzelnen Transaktion oder einer serialisierbare Transaktionsisolationsstufe ausgeführt werden. Weitere Informationen zu diesen Transaktionsisolationsstufen finden Sie unter SET TRANSACTION ISOLATION LEVEL (Transact-SQL). -
Die ORDER BY-Klausel enthält eine Spalte oder eine Kombination von Spalten, die garantiert nur einmal vorhanden sind.
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Grundlegende Syntax
A.Angeben einer einzelnen Spalte, die in der Auswahlliste definiert ist
USE AdventureWorks2012; GO SELECT ProductID, Name FROM Production.Product WHERE Name LIKE 'Lock Washer%' ORDER BY ProductID;
B.Angeben einer Spalte, die nicht in der Auswahlliste definiert wird
USE AdventureWorks2012; GO SELECT ProductID, Name, Color FROM Production.Product ORDER BY ListPrice;
C.Angeben eines Alias als Sortierspalte
USE AdventureWorks2012; GO SELECT name, SCHEMA_NAME(schema_id) AS SchemaName FROM sys.objects WHERE type = 'U' ORDER BY SchemaName;
D.Angeben eines Ausdrucks als Sortierspalte
USE AdventureWorks2012; Go SELECT BusinessEntityID, JobTitle, HireDate FROM HumanResources.Employee ORDER BY DATEPART(year, HireDate);
Angeben der auf- und absteigenden Sortierreihenfolge
A.Angeben einer absteigenden Reihenfolge
USE AdventureWorks2012; GO SELECT ProductID, Name FROM Production.Product WHERE Name LIKE 'Lock Washer%' ORDER BY ProductID DESC;
B.Angeben einer aufsteigenden Reihenfolge
USE AdventureWorks2012; GO SELECT ProductID, Name FROM Production.Product WHERE Name LIKE 'Lock Washer%' ORDER BY Name ASC ;
C.Angeben von auf- und absteigender Reihenfolge
USE AdventureWorks2012; GO SELECT LastName, FirstName FROM Person.Person WHERE LastName LIKE 'R%' ORDER BY FirstName ASC, LastName DESC ;
Angeben einer Sortierung
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
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 Rangfolgefunktion
USE AdventureWorks2012;
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
A.Angeben von ganzzahligen Konstanten für OFFSET- und FETCH-Werte
USE AdventureWorks2012;
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
USE AdventureWorks2012;
GO
-- Specifying variables for OFFSET and FETCH values
DECLARE @StartingRowNumber tinyint = 1
, @FetchRows tinyint = 8;
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC
OFFSET @StartingRowNumber ROWS
FETCH NEXT @FetchRows ROWS ONLY;
C.Angeben von Ausdrücken für OFFSET- und FETCH-Werte
USE AdventureWorks2012;
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
-- Specifying a constant scalar subquery
USE AdventureWorks2012;
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
USE AdventureWorks2012;
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'AdventureWorks2012') = 0
ALTER DATABASE AdventureWorks2012 SET ALLOW_SNAPSHOT_ISOLATION ON;
GO
-- Set the transaction isolation level to SNAPSHOT for this query.
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
GO
-- Beging 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
USE AdventureWorks2012; 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;