Share via


SELECT - ORDER BY-component (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric

Hiermee sorteert u gegevens die worden geretourneerd door een query in SQL Server. Gebruik deze component om:

  • Bestel de resultatenset van een query op basis van de opgegeven kolomlijst en beperk eventueel de rijen die worden geretourneerd naar een opgegeven bereik. De volgorde waarin rijen worden geretourneerd in een resultatenset wordt niet gegarandeerd, tenzij er een ORDER BY component is opgegeven.

  • Bepaal de volgorde waarin classificatiefunctiewaarden worden toegepast op de resultatenset.

Transact-SQL syntaxis-conventies

Note

ORDER BY wordt niet ondersteund in SELECT/INTO of CREATE TABLE AS SELECT (CTAS)-instructies in Azure Synapse Analytics of Analytics Platform System (PDW).

Syntax

Syntaxis voor SQL Server en Azure SQL Database.

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
    ]
}

Syntaxis voor Azure Synapse Analytics en Analytics Platform System (PDW):

[ ORDER BY
    {
    order_by_expression
    [ ASC | DESC ]
    } [ , ...n ]
]

Arguments

order_by_expression

Hiermee geeft u een kolom of expressie op waarop de queryresultatenset moet worden gesorteerd. U kunt een sorteerkolom opgeven als een naam of kolomalias, of als een niet-negatief geheel getal dat de positie van de kolom in de selectielijst vertegenwoordigt.

U kunt meerdere sorteerkolommen opgeven. Kolomnamen moeten uniek zijn. De volgorde van de sorteerkolommen in de ORDER BY component definieert de organisatie van de gesorteerde resultatenset. De resultatenset wordt gesorteerd op de eerste kolom en vervolgens wordt die geordende lijst gesorteerd op de tweede kolom, enzovoort.

De kolomnamen waarnaar u in de ORDER BY component verwijst, moeten overeenkomen met een kolom- of kolomalias in de selectielijst of met een kolom die is gedefinieerd in een tabel die in de FROM component is opgegeven, zonder dubbelzinnigheid. Als de ORDER BY component verwijst naar een kolomalias in de selectielijst, gebruikt u de kolomalias zelf. Gebruik de kolomalias niet als onderdeel van een expressie in de ORDER BY component.

Voorbeeld:

  • Correct gebruik:

    SELECT SCHEMA_NAME(schema_id) AS SchemaName
    FROM sys.objects
    ORDER BY SchemaName; -- correct
    
  • Onjuist gebruik:

    SELECT SCHEMA_NAME(schema_id) AS SchemaName
    FROM sys.objects
    ORDER BY SchemaName + ''; -- wrong
    

COLLATION_NAME

Hiermee geeft u op dat de ORDER BY bewerking moet worden uitgevoerd volgens de sortering die u opgeeft in collation_name, en niet volgens de sortering van de kolom zoals gedefinieerd in de tabel of weergave. De collation_name kan een Windows-sorteringsnaam of een SQL-sorteringsnaam zijn. Zie Sortering en Unicode-ondersteuningvoor meer informatie. COLLATE is alleen van toepassing op kolommen van het type teken, varchar, ncharen nvarchar.

ASC | DESC

Hiermee geeft u op dat de waarden in de opgegeven kolom in oplopende of aflopende volgorde moeten worden gesorteerd. ASC sorteert van de laagste waarde naar de hoogste waarde. DESC sorteert van de hoogste waarde naar de laagste waarde. ASC is de standaardsorteerdervolgorde. NULL waarden worden behandeld als de laagst mogelijke waarden.

VERSCHUIVING { integer_constant offset_row_count_expression | } { RIJ | RIJEN }

Van toepassing op: SQL Server 2012 (11.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance.

Hiermee geeft u het aantal rijen op dat moet worden overgeslagen voordat de query rijen uit de query-expressie retourneert. De waarde kan een geheel getalconstante of expressie zijn die groter is dan of gelijk is aan nul.

offset_row_count_expression kan een variabele, parameter of constante scalaire subquery zijn. Wanneer u een subquery gebruikt, kan deze niet verwijzen naar kolommen die zijn gedefinieerd in het buitenste querybereik. Dat wil gezegd, het kan niet worden gecorreleerd met de buitenste query.

ROW en ROWS synoniemen zijn en worden geleverd voor ANSI-compatibiliteit.

In queryuitvoeringsplannen wordt de waarde voor het aantal offsetrijen weergegeven in het kenmerk Offset van de TOP queryoperator.

FETCH { FIRST | VOLGENDE } { integer_constant fetch_row_count_expression | } { ROW | ALLEEN RIJEN }

Van toepassing op: SQL Server 2012 (11.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance.

Hiermee geeft u het aantal rijen op dat moet worden geretourneerd nadat de OFFSET component is verwerkt. De waarde kan een geheel getalconstante of expressie zijn die groter is dan of gelijk is aan één.

fetch_row_count_expression kan een variabele, parameter of constante scalaire subquery zijn. Wanneer u een subquery gebruikt, kan deze niet verwijzen naar kolommen die zijn gedefinieerd in het buitenste querybereik. Dat wil gezegd, het kan niet worden gecorreleerd met de buitenste query.

FIRST en NEXT synoniemen zijn en worden geleverd voor ANSI-compatibiliteit.

ROW en ROWS synoniemen zijn en worden geleverd voor ANSI-compatibiliteit.

In queryuitvoeringsplannen wordt de waarde voor het aantal offsetrijen weergegeven in het kenmerk Rijen of Het bovenste kenmerk van de TOP queryoperator.

Beste praktijken

Vermijd het opgeven van gehele getallen in de ORDER BY component als positionele weergaven van de kolommen in de selectielijst. Hoewel een instructie zoals SELECT ProductID, Name FROM Production.Production ORDER BY 2 geldig is, kunnen gebruikers het bijvoorbeeld moeilijk vinden om dit te begrijpen in vergelijking met het opgeven van de werkelijke kolomnaam. Daarnaast moeten wijzigingen in de selectielijst, zoals het wijzigen van de kolomvolgorde of het toevoegen van nieuwe kolommen, het wijzigen van de ORDER BY component vereisen om onverwachte resultaten te voorkomen.

Gebruik in een SELECT TOP (<n>) instructie altijd een ORDER BY component. Dit is de enige manier om voorspelbaar aan te geven welke rijen TOP van invloed zijn. Zie TOP voor meer informatie.

Interoperability

Wanneer u ORDER BY met een of INSERT...SELECT instructie rijen uit een SELECT...INTO andere bron invoegt, garandeert de ORDER BY component niet dat de rijen in de opgegeven volgorde worden ingevoegd.

Als OFFSET u de eigenschap bijwerkbaarheid van de weergave gebruikt en FETCH in een weergave niet wijzigt.

Limitations

Er is geen limiet voor het aantal kolommen in de ORDER BY component. De totale grootte van de kolommen die zijn opgegeven in een ORDER BY component mag echter niet groter zijn dan 8060 bytes.

U kunt geen kolommen van het type ntekst, tekst, afbeelding, geografie, geometrie of XML gebruiken in een ORDER BY component.

U kunt geen geheel getal of constante opgeven wanneer order_by_expression wordt weergegeven in een classificatiefunctie. Zie SELECT - OVER-component voor meer informatie.

Als u een tabelnaam in de FROM component aliast, moet u de aliasnaam gebruiken om de kolommen in de ORDER BY component te kwalificeren.

Als de SELECT instructie een van de volgende componenten of operators bevat, moet u kolomnamen en aliassen definiëren die zijn opgegeven in de ORDER BY component in de selectielijst:

  • UNION bediener
  • EXCEPT bediener
  • INTERSECT bediener
  • SELECT DISTINCT

Als de instructie bovendien een UNION, EXCEPTof INTERSECT operator bevat, moet de selectielijst van de eerste (linkse) query de kolomnamen of kolomaliassen opgeven.

In een query die gebruikmaakt van UNION, EXCEPTof INTERSECT operators, kunt u alleen aan het einde van de instructie gebruiken ORDER BY . Deze beperking geldt alleen voor wanneer u opgeeft UNION, EXCEPTen INTERSECT in een query op het hoogste niveau en niet in een subquery. Zie de sectie Voorbeelden.

De ORDER BY component is niet geldig in weergaven, inlinefuncties, afgeleide tabellen en subquery's, tenzij u ook de TOP of-componenten opgeeft FETCHOFFSET. Wanneer u deze objecten gebruikt ORDER BY , wordt de component alleen gebruikt om de rijen te bepalen die worden geretourneerd door de TOP component of OFFSETFETCH componenten. De ORDER BY component garandeert geen geordende resultaten wanneer deze constructies worden opgevraagd, tenzij ORDER BY deze ook worden opgegeven in de query zelf.

OFFSET en FETCH worden niet ondersteund in geïndexeerde weergaven of in een weergave die is gedefinieerd met behulp van de CHECK OPTION component.

OFFSET en FETCH kan worden gebruikt in elke query die de volgende beperkingen toestaat TOP en ORDER BY met de volgende beperkingen:

  • De OVER component biedt geen ondersteuning OFFSET voor en FETCH.

  • U kunt niet rechtstreeks opgeven in FETCH , UPDATEen DELETEMERGEinstructiesINSERT, maar u kunt deze opgeven OFFSET in een subquery die in deze instructies is gedefinieerd. In de INSERT INTO SELECT instructie kunt u bijvoorbeeld de instructie opgeven OFFSET en FETCH in de SELECT instructie.

  • In een query die gebruikmaakt UNIONvan , EXCEPT of INTERSECT operators, kan alleen de uiteindelijke query die de volgorde van de queryresultaten specificeert, opgeven OFFSET en FETCH.

  • U kunt TOP niet combineren met OFFSET en FETCH in dezelfde query-expressie (in hetzelfde querybereik).

VERSCHUIVING en OPHALEN gebruiken om de geretourneerde rijen te beperken

Gebruik de OFFSET en FETCH componenten in plaats van de TOP component om een oplossing voor het pageren van query's te implementeren en het aantal rijen dat naar een clienttoepassing wordt verzonden te beperken.

Voor het gebruik OFFSET en FETCH als pagingoplossing moet de query één keer worden uitgevoerd voor elke pagina met gegevens die worden geretourneerd naar de clienttoepassing. Als u bijvoorbeeld de resultaten van een query wilt retourneren in stappen van 10 rijen, moet u de query één keer uitvoeren om rijen 1 tot 10 te retourneren en vervolgens de query opnieuw uit te voeren om rij 11 tot 20 te retourneren, enzovoort. Elke query is onafhankelijk en is op geen enkele manier aan elkaar gerelateerd. Deze voorwaarde betekent dat, in tegenstelling tot het gebruik van een cursor waarin de query eenmaal wordt uitgevoerd en de status op de server wordt gehandhaafd, de clienttoepassing verantwoordelijk is voor het bijhouden van de status. Als u stabiele resultaten wilt bereiken tussen queryaanvragen met behulp van OFFSET en FETCH, moet aan de volgende voorwaarden worden voldaan:

  1. De onderliggende gegevens die door de query worden gebruikt, worden niet gewijzigd. Dat wil gezegd: de query werkt de rijen niet bij of alle aanvragen voor pagina's uit de query worden uitgevoerd in één transactie met behulp van momentopname- of serialiseerbare transactieisolatie. Zie SET TRANSACTION ISOLATION LEVEL voor meer informatie over deze transactieisolatieniveaus.

  2. De ORDER BY component bevat een kolom of combinatie van kolommen die gegarandeerd uniek zijn.

Zie het voorbeeld Meerdere query's uitvoeren in één transactie in de sectie Voorbeelden .

Als consistente uitvoeringsplannen belangrijk zijn in uw pagingoplossing, kunt u overwegen om de OPTIMIZE FOR queryhint voor de OFFSET en FETCH parameters te gebruiken. Zie Expressies opgeven voor OFFSET- en FETCH-waarden in de sectie Voorbeelden . Zie OPTIMIZE FOR voor meer informatie.

Examples

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

Category Aanbevolen syntaxiselementen
Basissyntaxis ORDER BY
Oplopende en aflopende volgorde opgeven DESC of ASC
Een sortering opgeven COLLATE
Een voorwaardelijke volgorde opgeven CASE-expressie
ORDER BY gebruiken in een classificatiefunctie Classificatiefuncties
Het aantal geretourneerde rijen beperken OFFSET en FETCH
ORDER BY gebruiken met UNION, EXCEPT en INTERSECT UNION

Basissyntaxis

Voorbeelden in deze sectie laten de basisfunctionaliteit van de ORDER BY-component zien met behulp van de minimaal vereiste syntaxis.

A. Eén kolom opgeven die is gedefinieerd in de selectielijst

In het volgende voorbeeld wordt de resultatenset gesorteerd op basis van de numerieke ProductID kolom. Omdat u geen sorteervolgorde opgeeft, gebruikt de query de standaardvolgorde in oplopende volgorde.

USE AdventureWorks2025;
GO

SELECT ProductID,
       Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID;

B. Een kolom opgeven die niet is gedefinieerd in de selectielijst

In het volgende voorbeeld wordt de resultatenset gesorteerd op een kolom die niet is opgenomen in de selectielijst, maar de FROM component geeft de tabel op die de kolom bevat.

USE AdventureWorks2025;
GO

SELECT ProductID,
       Name,
       Color
FROM Production.Product
ORDER BY ListPrice;

C. Een alias opgeven als de sorteerkolom

In het volgende voorbeeld wordt de kolomalias SchemaName opgegeven als de sorteervolgordekolom.

USE AdventureWorks2025;
GO

SELECT name,
       SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
WHERE type = 'U'
ORDER BY SchemaName;

D. Een expressie opgeven als de sorteerkolom

In het volgende voorbeeld wordt een expressie gebruikt als sorteerkolom. De expressie wordt gedefinieerd met behulp van de DATEPART functie om de resultatenset te sorteren op het jaar waarin werknemers zijn aangenomen.

USE AdventureWorks2025;
GO

SELECT BusinessEntityID,
       JobTitle,
       HireDate
FROM HumanResources.Employee
ORDER BY DATEPART(year, HireDate);

Oplopende en aflopende sorteervolgorde opgeven

A. Een aflopende volgorde opgeven

In het volgende voorbeeld wordt de resultatenset gesorteerd op de numerieke kolom ProductID in aflopende volgorde.

USE AdventureWorks2025;
GO

SELECT ProductID,
       Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID DESC;

B. Een oplopende volgorde opgeven

In het volgende voorbeeld wordt de resultatenset door de Name kolom in oplopende volgorde gesorteerd. De tekens worden alfabetisch gesorteerd, niet numeriek. Dat wil gezegd, 10 sorteert voor 2.

USE AdventureWorks2025;
GO

SELECT ProductID,
       Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY Name ASC;

C. Zowel oplopende als aflopende volgorde opgeven

In het volgende voorbeeld wordt de resultatenset met twee kolommen gesorteerd. De resultatenset van de query wordt eerst gesorteerd in oplopende volgorde op de FirstName kolom en vervolgens gesorteerd in aflopende volgorde op de LastName kolom.

USE AdventureWorks2025;
GO

SELECT LastName,
       FirstName
FROM Person.Person
WHERE LastName LIKE 'R%'
ORDER BY FirstName ASC, LastName DESC;

Een sortering opgeven

In het volgende voorbeeld ziet u hoe het opgeven van een sortering in de ORDER BY component de volgorde kan wijzigen waarin de queryresultaten worden geretourneerd. Er wordt een tabel gemaakt die een kolom bevat die is gedefinieerd met behulp van een hoofdlettergevoelige, accentgevoelige sortering. Waarden worden ingevoegd met verschillende hoofdletters en accentverschillen. Omdat er geen sortering is opgegeven in de ORDER BY component, gebruikt de eerste query de sortering van de kolom bij het sorteren van de waarden. In de tweede query wordt een hoofdlettergevoelige, accentgevoelige sortering opgegeven in de ORDER BY component, waarmee de volgorde wordt gewijzigd waarin de rijen worden geretourneerd.

USE tempdb;
GO

CREATE TABLE #t1
(
    name NVARCHAR (15) COLLATE Latin1_General_CI_AI
);

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;

Een voorwaardelijke volgorde opgeven

In de volgende voorbeelden wordt de CASE expressie in een ORDER BY component gebruikt om de sorteervolgorde van de rijen voorwaardelijk te bepalen op basis van een bepaalde kolomwaarde. In het eerste voorbeeld wordt de waarde in de SalariedFlag kolom van de HumanResources.Employee tabel geëvalueerd. Werknemers die de SalariedFlag set hebben ingesteld op 1, worden op volgorde geretourneerd door de BusinessEntityID in aflopende volgorde. Werknemers met de SalariedFlag waarde 0 worden in oplopende BusinessEntityID volgorde geretourneerd. In het tweede voorbeeld wordt de resultatenset gerangschikt op de kolom TerritoryName wanneer de kolom CountryRegionName gelijk is aan 'Verenigde Staten' en CountryRegionName op voor alle andere rijen.

SELECT BusinessEntityID,
       SalariedFlag
FROM HumanResources.Employee
ORDER BY
    CASE SalariedFlag
        WHEN 1 THEN BusinessEntityID
    END DESC,
    CASE
        WHEN SalariedFlag = 0 THEN BusinessEntityID
    END;
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;

ORDER BY gebruiken in een classificatiefunctie

In het volgende voorbeeld wordt de ORDER BY component gebruikt in de classificatiefuncties ROW_NUMBER, RANKen DENSE_RANKNTILE.

USE AdventureWorks2025;
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;

Het aantal geretourneerde rijen beperken

Van toepassing op: SQL Server 2012 (11.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance.

In de volgende voorbeelden wordt OFFSET het FETCH aantal rijen dat door een query wordt geretourneerd, beperkt.

A. Gehele getallen opgeven voor OFFSET- en FETCH-waarden

In het volgende voorbeeld wordt een geheel getalconstante opgegeven als de waarde voor de OFFSET en FETCH componenten. De eerste query retourneert alle rijen die zijn gesorteerd op de kolom DepartmentID. Vergelijk de resultaten die door deze query worden geretourneerd met de resultaten van de twee query's die erop volgen. De volgende query gebruikt de component OFFSET 5 ROWS om de eerste vijf rijen over te slaan en alle resterende rijen te retourneren. De laatste query maakt gebruik van de component OFFSET 0 ROWS om te beginnen met de eerste rij en gebruikt FETCH NEXT 10 ROWS ONLY vervolgens om de rijen te beperken die worden geretourneerd tot 10 rijen uit de gesorteerde resultatenset.

USE AdventureWorks2025;
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. Variabelen opgeven voor OFFSET- en FETCH-waarden

In het volgende voorbeeld worden de variabelen @RowsToSkip gede declareert en @FetchRows worden deze variabelen opgegeven in de OFFSET en FETCH componenten.

USE AdventureWorks2025;
GO

-- Specifying variables for OFFSET and FETCH values
DECLARE @RowsToSkip AS TINYINT = 2,
        @FetchRows AS TINYINT = 8;

SELECT DepartmentID,
       Name,
       GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC OFFSET @RowsToSkip ROWS
FETCH NEXT @FetchRows ROWS ONLY;

C. Expressies opgeven voor OFFSET- en FETCH-waarden

In het volgende voorbeeld wordt de expressie @StartingRowNumber - 1 gebruikt om de OFFSET waarde en de expressie @EndingRowNumber - @StartingRowNumber + 1 op te geven om de FETCH waarde op te geven. Daarnaast wordt de queryhint OPTIMIZE FORopgegeven. Gebruik deze hint om een bepaalde waarde op te geven voor een lokale variabele wanneer de query wordt gecompileerd en geoptimaliseerd. De waarde wordt alleen gebruikt tijdens het optimaliseren van query's en niet tijdens het uitvoeren van query's. Zie Hints voor query's voor meer informatie.

USE AdventureWorks2025;
GO

-- Specifying expressions for OFFSET and FETCH values
DECLARE @StartingRowNumber AS TINYINT = 1,
        @EndingRowNumber AS 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. Een constante scalaire subquery opgeven voor OFFSET- en FETCH-waarden

In het volgende voorbeeld wordt een constante scalaire subquery gebruikt om de waarde voor de FETCH component te definiëren. De subquery retourneert één waarde uit de kolom PageSize in de tabel dbo.AppSettings.

-- Specifying a constant scalar subquery
USE AdventureWorks2025;
GO

CREATE TABLE dbo.AppSettings
(
    AppSettingID INT NOT NULL,
    PageSize INT NOT NULL
);

INSERT INTO dbo.AppSettings
VALUES (1, 10);

DECLARE @StartingRowNumber AS 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. Meerdere query's uitvoeren in één transactie

In het volgende voorbeeld ziet u één methode voor het implementeren van een pagingoplossing die ervoor zorgt dat stabiele resultaten worden geretourneerd in alle aanvragen van de query. De query wordt uitgevoerd in één transactie met behulp van het isolatieniveau van de momentopname en de kolom die in de ORDER BY component is opgegeven, zorgt voor de uniekheid van de kolom.

USE AdventureWorks2025;
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'AdventureWorks2025') = 0
ALTER DATABASE AdventureWorks2025
SET ALLOW_SNAPSHOT_ISOLATION ON;

-- Set the transaction isolation level to SNAPSHOT for this query.
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;

-- Beginning the transaction.
BEGIN TRANSACTION;

-- Declare and set the variables for the OFFSET and FETCH values.
DECLARE @StartingRowNumber AS INT = 1,
        @RowCountPerPage AS 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
COMMIT TRANSACTION;

ORDER BY gebruiken met UNION, EXCEPT en INTERSECT

Wanneer een query gebruikmaakt van de UNION, EXCEPTof INTERSECT operators, geeft u de ORDER BY component aan het einde van de instructie op. De query sorteert de resultaten van de gecombineerde query's. Het volgende voorbeeld retourneert alle producten die rood of geel zijn en sorteert deze gecombineerde lijst op de kolom ListPrice.

USE AdventureWorks2025;
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;

Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)

In het volgende voorbeeld ziet u de volgorde van een resultatenset door de numerieke EmployeeKey kolom in oplopende volgorde.

-- Uses AdventureWorks
SELECT EmployeeKey,
       FirstName,
       LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY EmployeeKey;

In het volgende voorbeeld wordt een resultatenset gesorteerd op basis van de numerieke EmployeeKey kolom in aflopende volgorde.

-- Uses AdventureWorks
SELECT EmployeeKey,
       FirstName,
       LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY EmployeeKey DESC;

In het volgende voorbeeld wordt een resultatenset door de LastName kolom gesorteerd.

-- Uses AdventureWorks
SELECT EmployeeKey,
       FirstName,
       LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY LastName;

In het volgende voorbeeld worden twee kolommen gerangschikt. Deze query sorteert eerst in oplopende volgorde op de FirstName kolom en sorteert vervolgens algemene FirstName waarden in aflopende volgorde op de LastName kolom.

-- Uses AdventureWorks
SELECT EmployeeKey,
       FirstName,
       LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY LastName, FirstName;