Clausola SELECT - ORDER BY (Transact-SQL)
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL di Azure Synapse Analytics Platform System (PDW) in Microsoft Fabric Warehouse nel database SQL di Microsoft Fabric in Microsoft Fabric
Ordina i dati restituiti da una query in SQL Server. Utilizzare questa clausola per eseguire le operazioni seguenti:
Ordinare il set di risultati di una query in base all'elenco di colonne specificato e, facoltativamente, limitare le righe restituite a un intervallo specificato. L'ordine in cui le righe vengono restituite in un set di risultati non sono garantite a meno che non venga specificata una
ORDER BY
clausola.Determinare l'ordine in cui i valori della funzione di rango vengono applicati al set di risultati.
Convenzioni relative alla sintassi Transact-SQL
Nota
ORDER BY
non è supportato nelle SELECT
/INTO
istruzioni O CREATE TABLE AS SELECT
(CTAS) in Azure Synapse Analytics o in Analytics Platform System (PDW).
Sintassi
Sintassi per SQL Server e database SQL di Azure.
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
]
}
Sintassi per Azure Synapse Analytics e Parallel Data Warehouse.
[ ORDER BY
{
order_by_expression
[ ASC | DESC ]
} [ , ...n ]
]
Argomenti
order_by_expression
Specifica una colonna o un'espressione sulla quale ordinare il set di risultati della query. Una colonna di ordinamento può essere specificata come un nome o un alias di colonna o un intero non negativo che rappresenta la posizione della colonna nell'elenco di selezione.
È possibile specificare più colonne di ordinamento. I nomi delle colonne devono essere univoci. La sequenza delle colonne di ordinamento nella ORDER BY
clausola definisce l'organizzazione del set di risultati ordinato. Ciò significa che il set di risultati viene ordinato in base alla prima colonna e che l'elenco ordinato viene ordinato in base alla seconda colonna e così via.
I nomi di colonna a cui si fa riferimento nella ORDER BY
clausola devono corrispondere a una colonna o a un alias di colonna nell'elenco di selezione o a una colonna definita in una tabella specificata nella FROM
clausola senza ambiguità. Se la ORDER BY
clausola fa riferimento a un alias di colonna dall'elenco di selezione, l'alias di colonna deve essere usato autonomamente e non come parte di un'espressione nella ORDER BY
clausola, ad esempio:
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
Specifica che l'operazione ORDER BY
deve essere eseguita in base alle regole di confronto specificate in collation_name e non in base alle regole di confronto della colonna, come definito nella tabella o nella vista. Il collation_name può essere un nome delle regole di confronto di Windows o un nome delle regole di confronto SQL. Per ulteriori informazioni, vedere Supporto per Unicode e regole di confronto. COLLATE
è applicabile solo per le colonne di tipo char, varchar, nchar e nvarchar.
ASC | DESC
Specifica che i valori nella colonna specificata devono essere ordinati in ordine crescente o decrescente. ASC
consente di ordinare i valori dal più piccolo al più grande. DESC
consente di ordinare i valori dal più grande al più piccolo. ASC
è l'ordinamento predefinito. NULL
i valori vengono considerati come i valori più bassi possibili.
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
Si applica a: SQL Server 2012 (11.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.
Specifica il numero di righe da ignorare prima della restituzione delle righe dall'espressione di query. Il valore può essere un valore costante intero o un'espressione maggiore o uguale a zero.
offset_row_count_expression può essere una variabile, un parametro o una sottoquery scalare costante. Quando viene usata una sottoquery, non può fare riferimento ad alcuna colonna definita nell'ambito della query esterna. Ovvero, non può essere correlato alla query esterna.
ROW
e ROWS
sono sinonimi e sono forniti per la compatibilità ANSI.
Nei piani di esecuzione delle query, il valore del conteggio delle righe di offset viene visualizzato nell'attributo Offset dell'operatore TOP
di query.
FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
Si applica a: SQL Server 2012 (11.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.
Specifica il numero di righe da restituire dopo l'elaborazione della OFFSET
clausola. Il valore può essere un valore costante intero o un'espressione maggiore o uguale a uno.
fetch_row_count_expression può essere una variabile, un parametro o una sottoquery scalare costante. Quando viene usata una sottoquery, non può fare riferimento ad alcuna colonna definita nell'ambito della query esterna. Ovvero, non può essere correlato alla query esterna.
FIRST
e NEXT
sono sinonimi e sono forniti per la compatibilità ANSI.
ROW
e ROWS
sono sinonimi e sono forniti per la compatibilità ANSI.
Nei piani di esecuzione delle query, il valore del numero di righe di offset viene visualizzato nell'attributo Rows o Top dell'operatore TOP
di query.
Procedure consigliate
Evitare di specificare numeri interi nella ORDER BY
clausola come rappresentazioni posizionali delle colonne nell'elenco di selezione. Ad esempio, anche se un'istruzione come SELECT ProductID, Name FROM Production.Production ORDER BY 2
è valida, l'istruzione non è così facilmente comprensibile da altri utenti rispetto alla specifica del nome effettivo della colonna. Inoltre, le modifiche apportate all'elenco di selezione, ad esempio la modifica dell'ordine di colonna o l'aggiunta di nuove colonne, richiedono la modifica della ORDER BY
clausola per evitare risultati imprevisti.
In un'istruzione SELECT TOP (<n>)
usare sempre una ORDER BY
clausola . Questo è l'unico modo per indicare in modo prevedibile quali righe sono interessate da TOP
. Per altre informazioni, vedere TOP.
Interoperabilità
Se utilizzata con un'istruzione SELECT...INTO
o INSERT...SELECT
per inserire righe da un'altra origine, la ORDER BY
clausola non garantisce che le righe vengano inserite nell'ordine specificato.
L'uso di OFFSET
e FETCH
in una visualizzazione non modifica la proprietà aggiornabilità della visualizzazione.
Limiti
Non esiste alcun limite al numero di colonne nella ORDER BY
clausola . Tuttavia, le dimensioni totali delle colonne specificate in una ORDER BY
clausola non possono superare 8.060 byte.
Le colonne di tipo ntext, text, image, geography, geometry e xml non possono essere usate in una ORDER BY
clausola .
Non è possibile specificare un numero intero o una costante quando order_by_expression viene visualizzato in una funzione di classificazione. Per altre informazioni, vedere clausola SELECT - OVER.
Se un nome di tabella è alias nella FROM
clausola , è possibile usare solo il nome alias per qualificare le colonne nella ORDER BY
clausola .
I nomi di colonna e gli alias specificati nella ORDER BY
clausola devono essere definiti nell'elenco di selezione se l'istruzione SELECT
contiene una delle clausole o degli operatori seguenti:
UNION
operatoreEXCEPT
operatoreINTERSECT
operatoreSELECT DISTINCT
Inoltre, quando l'istruzione include un UNION
operatore , EXCEPT
o INTERSECT
, i nomi di colonna o gli alias di colonna devono essere specificati nell'elenco di selezione della prima query (lato sinistro).
In una query che usa UNION
operatori ORDER BY
, EXCEPT
o INTERSECT
è consentito solo alla fine dell'istruzione. Questa restrizione si applica solo a quando si specifica UNION
, EXCEPT
e INTERSECT
in una query di primo livello e non in una sottoquery. Vedere la sezione Esempi riportata di seguito.
La ORDER BY
clausola non è valida nelle viste, nelle funzioni inline, nelle tabelle derivate e nelle sottoquery, a meno che non vengano specificate anche le TOP
clausole o OFFSET
e FETCH
. Quando ORDER BY
viene utilizzato in questi oggetti, la clausola viene utilizzata solo per determinare le righe restituite dalla TOP
clausola o OFFSET
dalle clausole e FETCH
. La ORDER BY
clausola non garantisce risultati ordinati quando questi costrutti vengono sottoposti a query, a meno che ORDER BY
non sia specificato anche nella query stessa.
OFFSET
e FETCH
non sono supportati nelle viste indicizzate o in una vista definita tramite la CHECK OPTION
clausola .
OFFSET
e FETCH
possono essere usati in qualsiasi query che consenta TOP
e ORDER BY
con le limitazioni seguenti:
La
OVER
clausola non supportaOFFSET
eFETCH
.OFFSET
eFETCH
non possono essere specificati direttamente nelleINSERT
istruzioni ,UPDATE
MERGE
, eDELETE
, ma possono essere specificate in una sottoquery definita in queste istruzioni. Ad esempio, nell'istruzioneINSERT INTO SELECT
OFFSET
eFETCH
può essere specificato nell'istruzioneSELECT
.In una query che usa
UNION
operatoriOFFSET
oEXCEPT
INTERSECT
eFETCH
può essere specificata solo nella query finale che specifica l'ordine dei risultati della query.TOP
non può essere combinato conOFFSET
eFETCH
nella stessa espressione di query (nello stesso ambito di query).
Usare OFFSET e FETCH per limitare le righe restituite
È consigliabile usare le OFFSET
clausole e FETCH
anziché la TOP
clausola per implementare una soluzione di paging di query e limitare il numero di righe inviate a un'applicazione client.
L'uso di OFFSET
e FETCH
come soluzione di paging richiede l'esecuzione della query una sola volta per ogni pagina di dati restituita all'applicazione client. Ad esempio, per restituire i risultati di una query con incrementi di 10 righe, è necessario eseguire la query una volta per restituire le righe da 1 a 10 e quindi eseguire di nuovo la query per restituire le righe da 11 a 20 e così via. Ogni query è indipendente e non correlata in alcun modo all'altra. Ciò significa che, contrariamente all'utilizzo di un cursore in cui viene eseguita la query e lo stato viene gestito nel server, l'applicazione client è responsabile del rilevamento dello stato. Per ottenere risultati stabili tra le richieste di query che usano OFFSET
e FETCH
, è necessario soddisfare le condizioni seguenti:
I dati sottostanti utilizzati dalla query non devono cambiare. Ovvero, le righe interessate dalla query non vengono aggiornate o tutte le richieste di pagine della query vengono eseguite in una singola transazione usando l'isolamento delle transazioni snapshot o serializzabile. Per altre informazioni su questi livelli di isolamento delle transazioni, vedere SET TRANSACTION ISOLATION LEVEL.
La
ORDER BY
clausola contiene una colonna o una combinazione di colonne che sono sicuramente univoche.
Vedere l'esempio "Esecuzione di più query in una singola transazione" nella sezione Esempi più avanti in questo articolo.
Se i piani di esecuzione coerenti sono importanti nella soluzione di paging, è consigliabile usare l'hint OPTIMIZE FOR
per la query per i OFFSET
parametri e FETCH
. Vedere Specificare espressioni per i valori OFFSET e FETCH nella sezione Esempi più avanti in questo articolo. Per altre informazioni su OPTIMIZE FOR
, vedere Hint di query.
Esempi
Gli esempi di codice Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022
o AdventureWorksDW2022
, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.
Categoria | Elementi di sintassi inclusi |
---|---|
Sintassi di base | ORDER BY |
Specificare l'ordine crescente e decrescente | DESC oppure ASC |
Specificare le regole di confronto | COLLATE |
Specificare un ordine condizionale | Espressione CASE |
Usare ORDER BY in una funzione di classificazione | Funzioni di rango |
Limitare il numero di righe restituite | OFFSET e FETCH |
Usare ORDER BY con UNION, EXCEPT e INTERSECT | UNION |
Sintassi di base
Gli esempi in questa sezione illustrano le funzionalità di base della ORDER BY
clausola usando la sintassi minima richiesta.
R. Specificare una singola colonna definita nell'elenco di selezione
Nell'esempio seguente il set di risultati viene ordinato in base alla colonna ProductID
numerica. Poiché non viene specificato un ordinamento specifico, viene usato il valore predefinito (ordine crescente).
USE AdventureWorks2022;
GO
SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID;
B. Specificare una colonna non definita nell'elenco di selezione
Nell'esempio seguente il set di risultati viene ordinato da una colonna non inclusa nell'elenco di selezione, ma definita nella tabella specificata nella FROM
clausola .
USE AdventureWorks2022;
GO
SELECT ProductID, Name, Color
FROM Production.Product
ORDER BY ListPrice;
C. Specificare un alias come colonna di ordinamento
Nell'esempio seguente l'alias della colonna SchemaName
viene specificato come colonna di ordinamento.
USE AdventureWorks2022;
GO
SELECT name, SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
WHERE type = 'U'
ORDER BY SchemaName;
D. Specificare un'espressione come colonna di ordinamento
Nell'esempio seguente viene utilizzata un'espressione come colonna di ordinamento. L'espressione viene definita usando la DATEPART
funzione per ordinare il set di risultati in base all'anno in cui sono stati assunti i dipendenti.
USE AdventureWorks2022;
GO
SELECT BusinessEntityID, JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY DATEPART(year, HireDate);
Specificare l'ordinamento crescente e decrescente
R. Specificare un ordine decrescente
Nell'esempio seguente il set di risultati viene ordinato in base alla colonna numerica ProductID
in ordine decrescente.
USE AdventureWorks2022;
GO
SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID DESC;
B. Specificare un ordine crescente
Nell'esempio seguente il set di risultati viene ordinato in base alla colonna Name
in ordine crescente. I caratteri sono ordinati alfabeticamente, non numericamente. Di conseguenza, 10 precede 2.
USE AdventureWorks2022;
GO
SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY Name ASC;
C. Specificare l'ordine crescente e decrescente
Nell'esempio seguente il set di risultati viene ordinato in base a due colonne. Il set di risultati della query viene ordinato prima in ordine crescente in base alla colonna FirstName
e quindi in ordine decrescente in base alla colonna LastName
.
USE AdventureWorks2022;
GO
SELECT LastName, FirstName
FROM Person.Person
WHERE LastName LIKE 'R%'
ORDER BY FirstName ASC, LastName DESC;
Specificare le regole di confronto
Nell'esempio seguente viene illustrato come specificare regole di confronto nella ORDER BY
clausola può modificare l'ordine in cui vengono restituiti i risultati della query. Viene creata una tabella contenente una colonna definita tramite regole di confronto che non fanno distinzione tra maiuscole e minuscole e tra i vari accenti. I valori vengono inseriti con varie differenze tra maiuscole e minuscole e accentate. Poiché non sono specificate regole di confronto nella ORDER BY
clausola , la prima query usa le regole di confronto della colonna durante l'ordinamento dei valori. Nella seconda query, nella clausola viene specificata ORDER BY
una regola di confronto con distinzione tra maiuscole e minuscole, che modifica l'ordine in cui vengono restituite le righe.
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;
Specificare un ordine condizionale
Negli esempi seguenti viene usata l'espressione CASE
in una ORDER BY
clausola per determinare in modo condizionale l'ordinamento delle righe in base a un determinato valore di colonna. Nel primo esempio, viene calcolato il valore nella colonna SalariedFlag
della tabella HumanResources.Employee
. I dipendenti per cui SalariedFlag
è impostato su 1 vengono restituiti in ordine decrescente in base a BusinessEntityID
. I dipendenti per cui SalariedFlag
è impostato su 0 vengono restituiti in ordine crescente in base a BusinessEntityID
. Nel secondo esempio il set di risultati viene ordinato in base alla colonna TerritoryName
quando la colonna CountryRegionName
è uguale a 'Stati Uniti' e in base a CountryRegionName
per tutte le altre righe.
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;
Usare ORDER BY in una funzione di classificazione
Nell'esempio seguente viene usata la ORDER BY
clausola nelle funzioni ROW_NUMBER
di classificazione , , RANK
DENSE_RANK
e 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;
Limitare il numero di righe restituite
Si applica a: SQL Server 2012 (11.x) e versioni successive, database SQL di Azure e Istanza gestita di SQL di Azure.
Gli esempi seguenti usano OFFSET
e FETCH
per limitare il numero di righe restituite da una query.
R. Specificare le costanti integer per i valori OFFSET e FETCH
Nell'esempio seguente viene specificata una costante integer come valore per le OFFSET
clausole e FETCH
. La prima query restituisce tutte le righe ordinate in base alla colonna DepartmentID
. Confrontare i risultati restituiti da questa query ai risultati delle due query che la seguono. La query successiva usa la clausola OFFSET 5 ROWS
per ignorare le prime cinque righe e restituire tutte le righe rimanenti. Nella query finale viene utilizzata la clausola OFFSET 0 ROWS
per iniziare con la prima riga, quindi FETCH NEXT 10 ROWS ONLY
per limitare le righe restituite a 10 righe dal set di risultati ordinato.
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. Specificare le variabili per i valori OFFSET e FETCH
Nell'esempio seguente vengono dichiarate le variabili @RowsToSkip
e @FetchRows
vengono specificate nelle OFFSET
clausole e FETCH
.
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. Specificare le espressioni per i valori OFFSET e FETCH
Nell'esempio seguente viene utilizzata l'espressione @StartingRowNumber - 1
per specificare il OFFSET
valore e l'espressione @EndingRowNumber - @StartingRowNumber + 1
per specificare il valore FETCH. Viene inoltre specificato l'hint per la query , OPTIMIZE FOR
. Questo hint può essere utilizzato per specificare un valore per una variabile locale quando la query viene compilata e ottimizzata. Il valore viene utilizzato solo durante l'ottimizzazione della query e non durante l'esecuzione. Per altre informazioni, vedere Hint per la query.
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. Specificare una sottoquery scalare costante per i valori OFFSET e FETCH
Nell'esempio seguente viene utilizzata una sottoquery scalare costante per definire il valore per la FETCH
clausola . La sottoquery restituisce un singolo valore dalla colonna PageSize
nella tabella dbo.AppSettings
.
-- 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. Eseguire più query in una singola transazione
Nell'esempio seguente viene illustrato un metodo per l'implementazione di una soluzione di paging che garantisca la restituzione di risultati stabili in tutte le richieste dalla query. La query viene eseguita in una singola transazione usando il livello di isolamento dello snapshot e la colonna specificata nella clausola garantisce l'univocità della ORDER BY
colonna.
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
Usare ORDER BY con UNION, EXCEPT e INTERSECT
Quando una query usa gli UNION
operatori , EXCEPT
o INTERSECT
, la ORDER BY
clausola deve essere specificata alla fine dell'istruzione e i risultati delle query combinate vengono ordinati. Nell'esempio seguente vengono restituiti tutti i prodotti rossi o gialli e questo elenco combinato viene ordinato in base alla colonna ListPrice
.
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;
Esempi: Azure Synapse Analytics e Piattaforma di strumenti analitici (PDW)
Nell'esempio seguente viene illustrato l'ordinamento di un set di risultati in base alla colonna EmployeeKey
numerica in ordine crescente.
-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY EmployeeKey;
Nell'esempio seguente un set di risultati viene ordinato in base alla colonna numerica EmployeeKey
in ordine decrescente.
-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY EmployeeKey DESC;
Nell'esempio seguente il set di risultati viene ordinato in base alla colonna LastName
.
-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY LastName;
Nell'esempio seguente l'ordinamento viene fatto in base a due colonne. Questa query esegue l'ordinamento crescente in base alla colonna FirstName
, quindi esegue un ordinamento decrescente dei valori FirstName
comuni in base alla colonna LastName
.
-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY LastName, FirstName;
Contenuto correlato
- Espressioni (Transact-SQL)
- SELECT (Transact-SQL)
- Clausola FROM con JOIN, APPLY, PIVOT (Transact-SQL)
- Funzioni di classificazione (Transact-SQL)
- TOP (Transact-SQL)
- Hint per la query (Transact-SQL)
- Operatori Set - EXCEPT e INTERSECT (Transact-SQL)
- Operatori Set - UNION (Transact-SQL)
- CASE (Transact-SQL)