Bagikan melalui


SELECT - KLAUSUL ORDER BY (Transact-SQL)

Berlaku untuk: Titik akhir analitik SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Platform System (PDW) SQL di Microsoft Fabric Warehouse 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 ORDER BY klausul ditentukan.

  • Tentukan urutan penerapan nilai fungsi peringkat ke tataan hasil.

Konvensi sintaks transact-SQL

Catatan

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

Sintaks

Sintaks untuk SQL Server dan 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
    ]
}

Sintaks untuk Azure Synapse Analytics dan Gudang Data Paralel.

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

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 non-negatif yang mewakili posisi kolom dalam daftar pemilihan.

Beberapa kolom pengurutan dapat ditentukan. Nama kolom harus unik. Urutan kolom pengurutan dalam ORDER BY klausul 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 ORDER BY klausul harus sesuai dengan alias kolom atau kolom dalam daftar pilih atau ke kolom yang ditentukan dalam tabel yang ditentukan dalam FROM klausul tanpa ambiguitas apa pun. ORDER BY Jika klausa mereferensikan alias kolom dari daftar pilih, alias kolom harus digunakan sendiri, dan bukan sebagai bagian dari beberapa ekspresi dalam ORDER BY klausa, 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 ORDER BY operasi 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 dapat berupa nama kolase Windows atau nama kolase SQL. Untuk informasi selengkapnya, lihat Dukungan Collation dan Unicode. COLLATEhanya 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 sortir default. NULL nilai diperlakukan sebagai nilai serendah mungkin.

OFFSET { integer_constant | offset_row_count_expression } { ROW | BARIS }

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

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.

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, itu tidak dapat dikorelasikan dengan kueri luar.

ROW dan ROWS merupakan sinonim dan disediakan untuk kompatibilitas ANSI.

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

AMBIL { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | BARIS } SAJA

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

Menentukan jumlah baris yang akan dikembalikan setelah OFFSET klausul diproses. Nilai dapat berupa konstanta bilangan bulat atau ekspresi yang lebih besar dari atau sama dengan konstanta bilangan bulat.

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, itu tidak dapat dikorelasikan dengan kueri luar.

FIRST dan NEXT merupakan sinonim dan disediakan untuk kompatibilitas ANSI.

ROW dan ROWS merupakan sinonim dan disediakan untuk kompatibilitas ANSI.

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

Praktik terbaik

Hindari menentukan bilangan bulat dalam ORDER BY klausa 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 ORDER BY klausa untuk menghindari hasil yang tidak terduga.

Dalam pernyataan SELECT TOP (<n>) , selalu gunakan klausa ORDER BY . Ini adalah satu-satunya cara untuk secara terprediksi menunjukkan baris mana yang dipengaruhi oleh TOP. Untuk informasi selengkapnya, lihat TOP.

Interoperabilitas

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

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

Batasan

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

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

Bilangan bulat atau konstanta tidak dapat ditentukan saat order_by_expression muncul dalam fungsi peringkat. Untuk informasi selengkapnya, lihat klausa SELECT - OVER.

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

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

  • UNION operator
  • EXCEPT operator
  • INTERSECT operator
  • SELECT DISTINCT

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

Dalam kueri yang menggunakan UNIONoperator , , EXCEPTatau INTERSECT , ORDER BY hanya diperbolehkan di akhir pernyataan. Pembatasan ini hanya berlaku untuk saat Anda menentukan UNION, , EXCEPTdan 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 TOP klausa atau OFFSET dan FETCH juga ditentukan. Ketika ORDER BY digunakan dalam objek ini, klausa hanya digunakan untuk menentukan baris yang dikembalikan oleh TOP klausa atau OFFSET dan FETCH klausa. 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 CHECK OPTION klausa.

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.

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

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

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

Gunakan OFFSET dan FETCH untuk membatasi baris yang dikembalikan

Anda harus menggunakan OFFSET klausa dan FETCH alih-alih TOP klausul untuk menerapkan solusi paging kueri dan membatasi jumlah baris yang dikirim ke aplikasi klien.

Menggunakan OFFSET dan FETCH sebagai solusi halaman mengharuskan 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.

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

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

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

Contoh

Sampel kode Transact-SQL dalam artikel ini menggunakan AdventureWorks2022 database sampel atau AdventureWorksDW2022 , yang dapat Anda unduh dari halaman beranda Sampel Microsoft SQL Server dan Proyek Komunitas.

Kategori Elemen sintaksis unggulan
Sintaks dasar ORDER BY
Tentukan urutan naik dan turun DESC atau ASC
Tentukan kolajek COLLATE
Tentukan urutan bersyarah CASE ekspresi
Menggunakan ORDER BY dalam fungsi peringkat Fungsi pemberian peringkat
Membatasi jumlah baris yang dikembalikan OFFSET dan FETCH
Gunakan ORDER BY dengan UNION, EXCEPT, dan INTERSECT UNION

Sintaks dasar

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

J. Tentukan 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. Tentukan kolom yang tidak ditentukan dalam daftar pilih

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

USE AdventureWorks2022;
GO

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

C. Tentukan 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. Tentukan ekspresi sebagai kolom pengurutan

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

USE AdventureWorks2022;
GO

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

Tentukan urutan urutan naik dan turun

J. Tentukan 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. Tentukan 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. Tentukan 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;

Tentukan kolajek

Contoh berikut menunjukkan cara menentukan kolase dalam ORDER BY klausul 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 ORDER BY klausa, kueri pertama menggunakan kolatasi kolom saat mengurutkan nilai. Di kueri kedua, kolase peka huruf besar/kecil dan peka huruf besar/kecil ditentukan dalam ORDER BY klausa, yang mengubah urutan di mana baris dikembalikan.

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;

Tentukan urutan bersyarah

Contoh berikut menggunakan CASE ekspresi dalam ORDER BY klausul untuk menentukan 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 klausul dalam fungsi ROW_NUMBERperingkat , , RANKDENSE_RANK, dan NTILE.ORDER BY

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

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

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

J. Tentukan konstanta bilangan bulat untuk nilai OFFSET dan FETCH

Contoh berikut menentukan konstanta bilangan bulat sebagai nilai untuk OFFSET klausa 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 lima 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. Tentukan variabel untuk nilai OFFSET dan FETCH

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

Contoh berikut menggunakan ekspresi @StartingRowNumber - 1 untuk menentukan OFFSET nilai 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.

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. Tentukan 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 ORDER BY klausul 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

Gunakan ORDER BY dengan UNION, EXCEPT, dan INTERSECT

Saat kueri menggunakan UNIONoperator , EXCEPT, atau INTERSECT , ORDER BY klausa 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;