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.
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. 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 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
operatorEXCEPT
operatorINTERSECT
operatorSELECT DISTINCT
Selain itu, ketika pernyataan menyertakan UNION
operator , EXCEPT
, atau INTERSECT
, nama kolom, atau alias kolom harus ditentukan dalam daftar pemilihan kueri pertama (sisi kiri).
Dalam kueri yang menggunakan UNION
operator , , EXCEPT
atau INTERSECT
, ORDER BY
hanya diperbolehkan 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 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 mendukungOFFSET
danFETCH
.OFFSET
danFETCH
tidak dapat ditentukan langsung dalamINSERT
pernyataan , ,UPDATE
MERGE
, danDELETE
, tetapi dapat ditentukan dalam subkueri yang ditentukan dalam pernyataan ini. Misalnya, dalamINSERT INTO SELECT
pernyataan,OFFSET
danFETCH
dapat ditentukan dalamSELECT
pernyataan.Dalam kueri yang menggunakan
UNION
operator ,EXCEPT
atauINTERSECT
,OFFSET
danFETCH
hanya dapat ditentukan dalam kueri akhir yang menentukan urutan hasil kueri.TOP
tidak dapat digabungkan denganOFFSET
danFETCH
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:
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.
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_NUMBER
peringkat , , RANK
DENSE_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 UNION
operator , 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;