Bagikan melalui


SELECT - ORDER BY Clause (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Titik akhir analitik SQL di Microsoft FabricWarehouse di Microsoft Fabric

Mengurutkan data yang dikembalikan oleh kueri di SQL Server. Gunakan klausa ini untuk:

  • Urutkan kumpulan hasil kueri menurut daftar kolom yang ditentukan dan, secara opsional, batasi baris yang dikembalikan ke rentang tertentu. Urutan di mana baris dikembalikan dalam kumpulan hasil tidak dijamin kecuali klausul ORDER BY ditentukan.

  • Tentukan urutan penerapan nilai fungsi peringkat ke tataan hasil.

Konvensi sintaks transact-SQL

Catatan

ORDER BY tidak didukung dalam pernyataan SELECT/INTO atau CREATE TABLE AS SELECT (CTAS) di Azure Synapse Analytics atau Analytics Platform System (PDW).

Sintaksis

-- Syntax for SQL Server and 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  
    ]  
}  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
[ ORDER BY   
    {  
    order_by_expression   
    [ ASC | DESC ]   
    } [ ,...n ]   
]   

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

order_by_expression
Menentukan kolom atau ekspresi untuk mengurutkan kumpulan hasil kueri. Kolom pengurutan dapat ditentukan sebagai nama atau alias kolom, atau bilangan bulat nonnegatif yang mewakili posisi kolom dalam daftar pemilihan.

Beberapa kolom pengurutan dapat ditentukan. Nama kolom harus unik. Urutan kolom pengurutan dalam klausul ORDER BY menentukan organisasi kumpulan hasil yang diurutkan. Artinya, tataan hasil diurutkan menurut kolom pertama lalu daftar yang diurutkan diurutkan menurut kolom kedua, dan sebagainya.

Nama kolom yang dirujuk dalam klausul ORDER BY harus sesuai dengan alias kolom atau kolom dalam daftar pilih atau ke kolom yang ditentukan dalam tabel yang ditentukan dalam klausul FROM tanpa ambiguitas apa pun. Jika klausa ORDER BY mereferensikan alias kolom dari daftar pilih, alias kolom harus digunakan mandiri, dan bukan sebagai bagian dari beberapa ekspresi dalam klausa ORDER BY, misalnya:

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

MENYUSUN collation_name
Menentukan bahwa operasi ORDER BY harus dilakukan sesuai dengan kolase yang ditentukan dalam collation_name, dan tidak sesuai dengan kolase kolom seperti yang ditentukan dalam tabel atau tampilan. collation_name bisa berupa nama kolase Windows atau nama kolase SQL. Untuk informasi selengkapnya, lihat Dukungan Kolate dan Unicode. COLLATE hanya berlaku untuk kolom jenis karakter, varchar, nchar, dan nvarchar.

ASC | DESC
Menentukan bahwa nilai dalam kolom tertentu harus diurutkan dalam urutan naik atau turun. ASC mengurutkan dari nilai terendah ke nilai tertinggi. DESC mengurutkan dari nilai tertinggi ke nilai terendah. ASC adalah urutan pengurutan default. Nilai kosong diperlakukan sebagai nilai serendah mungkin.

OFFSET { integer_constant | offset_row_count_expression } { ROW | BARIS }
Menentukan jumlah baris yang akan dilewati sebelum mulai mengembalikan baris dari ekspresi kueri. Nilai dapat berupa konstanta bilangan bulat atau ekspresi yang lebih besar dari atau sama dengan nol.

Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru dan Azure SQL Database.s

offset_row_count_expression dapat berupa variabel, parameter, atau subkueri skalar konstan. Saat subkueri digunakan, subkueri tidak dapat mereferensikan kolom apa pun yang ditentukan dalam cakupan kueri luar. Artinya, tidak dapat dikorelasikan dengan kueri luar.

ROW dan ROWS adalah sinonim dan disediakan untuk kompatibilitas ANSI.

Dalam rencana eksekusi kueri, nilai jumlah baris offset ditampilkan di atribut Offset operator kueri TOP.

AMBIL { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | BARIS } SAJA
Menentukan jumlah baris yang akan dikembalikan setelah klausul OFFSET diproses. Nilai dapat berupa konstanta bilangan bulat atau ekspresi yang lebih besar dari atau sama dengan konstanta bilangan bulat.

Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru dan Azure SQL Database.

fetch_row_count_expression dapat berupa variabel, parameter, atau subkueri skalar konstan. Saat subkueri digunakan, subkueri tidak dapat mereferensikan kolom apa pun yang ditentukan dalam cakupan kueri luar. Artinya, tidak dapat dikorelasikan dengan kueri luar.

PERTAMA dan BERIKUTNYA adalah sinonim dan disediakan untuk kompatibilitas ANSI.

ROW dan ROWS adalah sinonim dan disediakan untuk kompatibilitas ANSI.

Dalam rencana eksekusi kueri, nilai jumlah baris offset ditampilkan di atribut Baris atau Teratas dari operator kueri TOP.

Praktik Terbaik

Hindari menentukan bilangan bulat dalam klausa ORDER BY sebagai representasi posisi kolom dalam daftar pilih. Misalnya, meskipun pernyataan seperti SELECT ProductID, Name FROM Production.Production ORDER BY 2 valid, pernyataan tidak mudah dipahami oleh orang lain dibandingkan dengan menentukan nama kolom aktual. Selain itu, perubahan pada daftar pemilihan, seperti mengubah urutan kolom atau menambahkan kolom baru, memerlukan modifikasi klausa ORDER BY untuk menghindari hasil yang tidak terduga.

Dalam pernyataan SELECT TOP (N), selalu gunakan klausa ORDER BY. Ini adalah satu-satunya cara untuk menunjukkan baris mana yang dipengaruhi oleh TOP. Untuk informasi selengkapnya, lihat TOP (Transact-SQL).

Interoperabilitas

Ketika digunakan dengan SELECT... INTO atau INSERT... Pernyataan SELECT untuk menyisipkan baris dari sumber lain, klausa ORDER BY tidak menjamin baris disisipkan dalam urutan yang ditentukan.

Menggunakan OFFSET dan FETCH dalam tampilan tidak mengubah properti pembaruan tampilan.

Batasan dan Pembatasan

Tidak ada batasan jumlah kolom dalam klausa ORDER BY; namun, ukuran total kolom yang ditentukan dalam klausul ORDER BY tidak boleh melebihi 8.060 byte.

Kolom jenis ntext, teks, gambar, geografi, geometri, dan xml tidak dapat digunakan dalam klausa ORDER BY.

Bilangan bulat atau konstanta tidak dapat ditentukan ketika order_by_expression muncul dalam fungsi peringkat. Untuk informasi selengkapnya, lihat Klausul OVER (Transact-SQL).

Jika nama tabel diberi alias dalam klausa FROM, hanya nama alias yang dapat digunakan untuk memenuhi syarat kolomnya dalam klausa ORDER BY.

Nama kolom dan alias yang ditentukan dalam klausul ORDER BY harus ditentukan dalam daftar pilih jika pernyataan SELECT berisi salah satu klausa atau operator berikut:

  • Operator UNION

  • Operator EXCEPT

  • Operator INTERSECT

  • PILIH BERBEDA

Selain itu, ketika pernyataan menyertakan operator UNION, EXCEPT, atau INTERSECT, nama kolom, atau alias kolom harus ditentukan dalam daftar pemilihan kueri pertama (sisi kiri).

Dalam kueri yang menggunakan operator UNION, EXCEPT, atau INTERSECT, ORDER BY hanya diizinkan di akhir pernyataan. Pembatasan ini hanya berlaku untuk saat Anda menentukan UNION, EXCEPT, dan INTERSECT dalam kueri tingkat atas dan bukan dalam subkueri. Lihat bagian Contoh yang berikut ini.

Klausa ORDER BY tidak valid dalam tampilan, fungsi sebaris, tabel turunan, dan subkueri, kecuali klausa TOP atau OFFSET dan FETCH juga ditentukan. Ketika ORDER BY digunakan dalam objek ini, klausa hanya digunakan untuk menentukan baris yang dikembalikan oleh klausa TOP atau klausa OFFSET dan FETCH. Klausa ORDER BY tidak menjamin hasil yang diurutkan ketika konstruksi ini dikueri, kecuali ORDER BY juga ditentukan dalam kueri itu sendiri.

OFFSET dan FETCH tidak didukung dalam tampilan terindeks atau dalam tampilan yang ditentukan dengan menggunakan klausa CHECK OPTION.

OFFSET dan FETCH dapat digunakan dalam kueri apa pun yang memungkinkan TOP dan ORDER BY dengan batasan berikut:

  • Klausa OVER tidak mendukung OFFSET dan FETCH.

  • OFFSET dan FETCH tidak dapat ditentukan langsung dalam pernyataan INSERT, UPDATE, MERGE, dan DELETE, tetapi dapat ditentukan dalam subkueri yang ditentukan dalam pernyataan ini. Misalnya, dalam pernyataan INSERT INTO SELECT, OFFSET dan FETCH dapat ditentukan dalam pernyataan SELECT.

  • Dalam kueri yang menggunakan operator UNION, EXCEPT, atau INTERSECT, OFFSET dan FETCH hanya dapat ditentukan dalam kueri akhir yang menentukan urutan hasil kueri.

  • TOP tidak dapat dikombinasikan dengan OFFSET dan FETCH dalam ekspresi kueri yang sama (dalam cakupan kueri yang sama).

Menggunakan OFFSET dan FETCH untuk membatasi baris yang dikembalikan

Kami menyarankan agar Anda menggunakan klausul OFFSET dan FETCH alih-alih klausul TOP untuk menerapkan solusi penomoran halaman kueri dan membatasi jumlah baris yang dikirim ke aplikasi klien.

Menggunakan OFFSET dan FETCH sebagai solusi halaman memerlukan menjalankan kueri satu kali untuk setiap "halaman" data yang dikembalikan ke aplikasi klien. Misalnya, untuk mengembalikan hasil kueri dalam kenaikan 10 baris, Anda harus menjalankan kueri satu kali untuk mengembalikan baris 1 hingga 10 lalu menjalankan kueri lagi untuk mengembalikan baris 11 hingga 20 dan seterusnya. Setiap kueri bersifat independen dan tidak terkait satu sama lain dengan cara apa pun. Ini berarti bahwa, tidak seperti menggunakan kursor di mana kueri dijalankan sekali dan status dipertahankan di server, aplikasi klien bertanggung jawab untuk melacak status. Untuk mencapai hasil yang stabil antara permintaan kueri menggunakan OFFSET dan FETCH, kondisi berikut harus dipenuhi:

  1. Data yang mendasar yang digunakan oleh kueri tidak boleh berubah. Artinya, baris yang disentuh oleh kueri tidak diperbarui atau semua permintaan halaman dari kueri dijalankan dalam satu transaksi menggunakan rekam jepret atau isolasi transaksi yang dapat diserialisasikan. Untuk informasi selengkapnya tentang tingkat isolasi transaksi ini, lihat MENGATUR TINGKAT ISOLASI TRANSAKSI (Transact-SQL).

  2. Klausa ORDER BY berisi kolom atau kombinasi kolom yang dijamin unik.

Lihat contoh "Menjalankan beberapa kueri dalam satu transaksi" di bagian Contoh nanti dalam topik ini.

Jika rencana eksekusi yang konsisten penting dalam solusi halaman Anda, pertimbangkan untuk menggunakan petunjuk kueri OPTIMIZE FOR untuk parameter OFFSET dan FETCH. Lihat "Menentukan ekspresi untuk nilai OFFSET dan FETCH" di bagian Contoh nanti dalam topik ini. Untuk informasi selengkapnya tentang OPTIMIZE FOR, lihat Petunjuk Kueri (Transact-SQL).

Contoh

Kategori Elemen sintaksis unggulan
Sintaks dasar ORDER BY
Menentukan urutan naik dan turun DESC * ASC
Menentukan kolatasi COLLATE
Menentukan urutan bersyarah Ekspresi huruf besar/kecil
Menggunakan ORDER BY dalam fungsi peringkat Fungsi pemberian peringkat
Membatasi jumlah baris yang dikembalikan OFFSET * AMBIL
Menggunakan ORDER BY dengan UNION, EXCEPT, dan INTERSECT GABUNGAN

Sintaks dasar

Contoh di bagian ini menunjukkan fungsionalitas dasar klausul ORDER BY menggunakan sintaks minimum yang diperlukan.

J. Menentukan satu kolom yang ditentukan dalam daftar pilih

Contoh berikut mengurutkan hasil yang ditetapkan oleh kolom numerik ProductID . Karena urutan pengurutan tertentu tidak ditentukan, default (urutan naik) digunakan.

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

B. Menentukan kolom yang tidak ditentukan dalam daftar pemilihan

Contoh berikut mengurutkan hasil yang ditetapkan oleh kolom yang tidak disertakan dalam daftar pilih, tetapi ditentukan dalam tabel yang ditentukan dalam klausa FROM.

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

C. Menentukan alias sebagai kolom pengurutan

Contoh berikut menentukan alias SchemaName kolom sebagai kolom urutan pengurutan.

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

D. Menentukan ekspresi sebagai kolom pengurutan

Contoh berikut menggunakan ekspresi sebagai kolom pengurutan. Ekspresi didefinisikan dengan menggunakan fungsi DATEPART untuk mengurutkan hasil yang ditetapkan oleh tahun di mana karyawan dipekerjakan.

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

Menentukan urutan urutan naik dan turun

J. Menentukan urutan turun

Contoh berikut mengurutkan hasil yang ditetapkan oleh kolom ProductID numerik dalam urutan turun.

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

B. Menentukan urutan naik

Contoh berikut mengurutkan hasil yang ditetapkan oleh Name kolom dalam urutan naik. Karakter diurutkan menurut abjad, bukan numerik. Artinya, 10 sortir sebelum 2.

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

C. Menentukan urutan naik dan turun

Contoh berikut mengurutkan hasil yang ditetapkan oleh dua kolom. Kumpulan hasil kueri pertama-tama diurutkan dalam urutan naik menurut FirstName kolom lalu diurutkan dalam urutan turun menurut LastName kolom.

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

Menentukan kolatasi

Contoh berikut menunjukkan cara menentukan kolase dalam klausul ORDER BY dapat mengubah urutan hasil kueri dikembalikan. Tabel dibuat yang berisi kolom yang ditentukan dengan menggunakan kolatasi yang tidak peka huruf besar/kecil dan tidak peka huruf besar/kecil. Nilai disisipkan dengan berbagai perbedaan huruf besar/kecil dan aksen. Karena kolatasi tidak ditentukan dalam klausa ORDER BY, kueri pertama menggunakan kolater kolom saat mengurutkan nilai. Di kueri kedua, kolase peka huruf besar/kecil dan peka huruf besar/kecil ditentukan dalam klausa ORDER BY, yang mengubah urutan pengembalian baris.

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;  

Menentukan urutan bersyarah

Contoh berikut menggunakan ekspresi CASE dalam klausul ORDER BY untuk menentukan urutan urutan baris secara kondisional berdasarkan nilai kolom tertentu. Dalam contoh pertama, nilai dalam SalariedFlag kolom HumanResources.Employee tabel dievaluasi. Karyawan yang memiliki SalariedFlag set ke 1 dikembalikan dalam BusinessEntityID urutan menurut. Karyawan yang memiliki SalariedFlag set ke 0 dikembalikan dalam urutan BusinessEntityID naik. Dalam contoh kedua, tataan hasil diurutkan menurut kolom TerritoryName saat kolom CountryRegionName sama dengan 'Amerika Serikat' dan untuk CountryRegionName semua baris lainnya.

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;  

Menggunakan ORDER BY dalam fungsi peringkat

Contoh berikut menggunakan klausa ORDER BY dalam fungsi peringkat ROW_NUMBER, RANK, DENSE_RANK, dan 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;  

Membatasi jumlah baris yang dikembalikan

Contoh berikut menggunakan OFFSET dan FETCH untuk membatasi jumlah baris yang dikembalikan oleh kueri.

Berlaku untuk: SQL Server 2012 (11.x) dan yang lebih baru dan Azure SQL Database.

J. Menentukan konstanta bilangan bulat untuk nilai OFFSET dan FETCH

Contoh berikut menentukan konstanta bilangan bulat sebagai nilai untuk klausa OFFSET dan FETCH. Kueri pertama mengembalikan semua baris yang diurutkan menurut kolom DepartmentID. Bandingkan hasil yang dikembalikan oleh kueri ini dengan hasil dua kueri yang mengikutinya. Kueri berikutnya menggunakan klausa OFFSET 5 ROWS untuk melewati 5 baris pertama dan mengembalikan semua baris yang tersisa. Kueri akhir menggunakan klausa OFFSET 0 ROWS untuk memulai dengan baris pertama lalu menggunakan FETCH NEXT 10 ROWS ONLY untuk membatasi baris yang dikembalikan ke 10 baris dari kumpulan hasil yang diurutkan.

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. Menentukan variabel untuk nilai OFFSET dan FETCH

Contoh berikut mendeklarasikan variabel @RowsToSkip dan @FetchRows dan menentukan variabel ini dalam klausa OFFSET dan 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. Menentukan ekspresi untuk nilai OFFSET dan FETCH

Contoh berikut menggunakan ekspresi @StartingRowNumber - 1 untuk menentukan nilai OFFSET dan ekspresi @EndingRowNumber - @StartingRowNumber + 1 untuk menentukan nilai FETCH. Selain itu, petunjuk kueri, OPTIMIZE FOR, ditentukan. Petunjuk ini dapat digunakan untuk memberikan nilai tertentu untuk variabel lokal saat kueri dikompilasi dan dioptimalkan. Nilai hanya digunakan selama pengoptimalan kueri, dan bukan selama eksekusi kueri. Untuk informasi selengkapnya, lihat Petunjuk Kueri (Transact-SQL).

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. Menentukan subkueri skalar konstan untuk nilai OFFSET dan FETCH

Contoh berikut menggunakan subkueri skalar konstan untuk menentukan nilai klausa FETCH. Subkueri mengembalikan satu nilai dari kolom PageSize dalam tabel 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. Menjalankan beberapa kueri dalam satu transaksi

Contoh berikut menunjukkan satu metode penerapan solusi halaman yang memastikan hasil yang stabil dikembalikan di semua permintaan dari kueri. Kueri dijalankan dalam satu transaksi menggunakan tingkat isolasi rekam jepret, dan kolom yang ditentukan dalam klausa ORDER BY memastikan keunikan kolom.

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  

Menggunakan ORDER BY dengan UNION, EXCEPT, dan INTERSECT

Saat kueri menggunakan operator UNION, EXCEPT, atau INTERSECT, klausa ORDER BY harus ditentukan di akhir pernyataan dan hasil kueri gabungan diurutkan. Contoh berikut mengembalikan semua produk yang berwarna merah atau kuning dan mengurutkan daftar gabungan ini menurut kolom 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;  

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

Contoh berikut menunjukkan pengurutan hasil yang ditetapkan oleh kolom numerik EmployeeKey dalam urutan naik.

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

Contoh berikut mengurutkan hasil yang ditetapkan oleh kolom numerik EmployeeKey dalam urutan turun.

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

Contoh berikut mengurutkan hasil yang ditetapkan oleh LastName kolom.

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

Contoh berikut mengurutkan menurut dua kolom. Kueri ini pertama-tama mengurutkan dalam urutan naik menurut FirstName kolom, lalu mengurutkan nilai umum FirstName dalam urutan turun menurut LastName kolom.

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

Lihat Juga

Ekspresi (Transact-SQL)
SELECT (Transact-SQL)
FROM (Transact-SQL)
Fungsi Peringkat (Transact-SQL)
TOP (Transact-SQL)
Petunjuk Kueri (T-SQL)
EXCEPT dan INTERSECT (Transact-SQL)
UNION (Transact-SQL)
CASE (Transact-SQL)