DELETE (Transact-SQL)
Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Warehouse di Microsoft Fabric
Menghapus satu atau beberapa baris dari tabel atau tampilan di SQL Server.
Sintaks
-- Syntax for SQL Server and Azure SQL Database
[ WITH <common_table_expression> [ ,...n ] ]
DELETE
[ TOP ( expression ) [ PERCENT ] ]
[ FROM ]
{ { table_alias
| <object>
| rowset_function_limited
[ WITH ( table_hint_limited [ ...n ] ) ] }
| @table_variable
}
[ <OUTPUT Clause> ]
[ FROM table_source [ ,...n ] ]
[ WHERE { <search_condition>
| { [ CURRENT OF
{ { [ GLOBAL ] cursor_name }
| cursor_variable_name
}
]
}
}
]
[ OPTION ( <Query Hint> [ ,...n ] ) ]
[; ]
<object> ::=
{
[ server_name.database_name.schema_name.
| database_name. [ schema_name ] .
| schema_name.
]
table_or_view_name
}
-- Syntax for Azure Synapse Analytics and Microsoft Fabric
[ WITH <common_table_expression> [ ,...n ] ]
DELETE [database_name . [ schema ] . | schema. ] table_name
FROM [database_name . [ schema ] . | schema. ] table_name
JOIN {<join_table_source>}[ ,...n ]
ON <join_condition>
[ WHERE <search_condition> ]
[ OPTION ( <query_options> [ ,...n ] ) ]
[; ]
<join_table_source> ::=
{
[ database_name . [ schema_name ] . | schema_name . ] table_or_view_name [ AS ] table_or_view_alias
[ <tablesample_clause>]
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
}
-- Syntax for Parallel Data Warehouse
DELETE
[ FROM [database_name . [ schema ] . | schema. ] table_name ]
[ WHERE <search_condition> ]
[ OPTION ( <query_options> [ ,...n ] ) ]
[; ]
Argumen
WITH <common_table_expression>
Menentukan kumpulan hasil bernama sementara, juga dikenal sebagai ekspresi tabel umum, yang ditentukan dalam cakupan pernyataan DELETE. Kumpulan hasil berasal dari pernyataan SELECT.
Ekspresi tabel umum juga dapat digunakan dengan pernyataan SELECT, INSERT, UPDATE, dan CREATE VIEW. Untuk informasi selengkapnya, lihat WITH common_table_expression (Transact-SQL).
TOP (ekspresi) [ PERCENT ]
Menentukan jumlah atau persentase baris acak yang akan dihapus. ekspresi dapat berupa angka atau persentase baris. Baris yang direferensikan dalam ekspresi TOP yang digunakan dengan INSERT, UPDATE, atau DELETE tidak diatur dalam urutan apa pun. Untuk informasi selengkapnya, lihat TOP (Transact-SQL).
DARI
Kata kunci opsional yang dapat digunakan antara kata kunci DELETE dan table_or_view_name target, atau rowset_function_limited.
table_alias
Alias yang ditentukan dalam klausa FROM table_source yang mewakili tabel atau tampilan tempat baris akan dihapus.
server_name
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.
Nama server (menggunakan nama server tertaut atau fungsi OPENDATASOURCE sebagai nama server) tempat tabel atau tampilan berada. Jika server_name ditentukan, database_name dan schema_name diperlukan.
database_name
Nama database.
schema_name
Nama skema tempat tabel atau tampilan berada.
table_or_view_name
Nama tabel atau tampilan tempat baris akan dihapus.
Variabel tabel, dalam cakupannya, juga dapat digunakan sebagai sumber tabel dalam pernyataan DELETE.
Tampilan yang dirujuk oleh table_or_view_name harus dapat diperbarui dan mereferensikan tepat satu tabel dasar dalam klausa FROM dari definisi tampilan. Untuk informasi selengkapnya tentang tampilan yang dapat diperbarui, lihat CREATE VIEW (Transact-SQL).
rowset_function_limited
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.
Baik fungsi OPENQUERY atau OPENROWSET, tunduk pada kemampuan penyedia.
DENGAN (<table_hint_limited> [... n] )
Menentukan satu atau beberapa petunjuk tabel yang diizinkan untuk tabel target. Kata kunci WITH dan tanda kurung diperlukan. NOLOCK dan READUNCOMMITTED tidak diperbolehkan. Untuk informasi selengkapnya tentang petunjuk tabel, lihat Petunjuk Tabel (Transact-SQL).
<OUTPUT_Clause>
Mengembalikan baris yang dihapus, atau ekspresi berdasarkan baris tersebut, sebagai bagian dari operasi DELETE. Klausa OUTPUT tidak didukung dalam pernyataan DML apa pun yang menargetkan tampilan atau tabel jarak jauh. Untuk informasi selengkapnya tentang argumen dan perilaku klausa ini, lihat Klausul OUTPUT (Transact-SQL).
DARI table_source
Menentukan klausa FROM tambahan. Ekstensi Transact-SQL ke DELETE ini memungkinkan menentukan data dari <table_source> dan menghapus baris yang sesuai dari tabel dalam klausa FROM pertama.
Ekstensi ini, menentukan gabungan, dapat digunakan alih-alih subkueri dalam klausul WHERE untuk mengidentifikasi baris yang akan dihapus.
Untuk informasi selengkapnya, lihat FROM (Transact-SQL).
WHERE
Menentukan kondisi yang digunakan untuk membatasi jumlah baris yang dihapus. Jika klausa WHERE tidak disediakan, DELETE akan menghapus semua baris dari tabel.
Ada dua bentuk operasi penghapusan berdasarkan apa yang ditentukan dalam klausa WHERE:
Penghapusan yang dicari menentukan kondisi pencarian untuk memenuhi syarat baris yang akan dihapus. Misalnya, nilai WHERE column_name = .
Penghapusan yang diposisikan menggunakan klausa CURRENT OF untuk menentukan kursor. Operasi penghapusan terjadi pada posisi kursor saat ini. Ini bisa lebih akurat daripada pernyataan DELETE yang dicari yang menggunakan klausa WHERE search_condition untuk memenuhi syarat baris yang akan dihapus. Pernyataan DELETE yang dicari menghapus beberapa baris jika kondisi pencarian tidak secara unik mengidentifikasi satu baris.
<search_condition>
Menentukan kondisi pembatasan untuk baris yang akan dihapus. Tidak ada batasan jumlah predikat yang dapat disertakan dalam kondisi pencarian. Untuk informasi selengkapnya, lihat Kondisi Pencarian (Transact-SQL).
SAAT INI DARI
Menentukan bahwa DELETE dilakukan pada posisi kursor yang ditentukan saat ini.
GLOBAL
Menentukan bahwa cursor_name mengacu pada kursor global.
cursor_name
Adalah nama kursor terbuka tempat pengambilan dibuat. Jika kursor global dan lokal dengan nama cursor_name ada, argumen ini mengacu pada kursor global jika GLOBAL ditentukan; jika tidak, itu mengacu pada kursor lokal. Kursor harus memperbolehkan pembaruan.
cursor_variable_name
Nama variabel kursor. Variabel kursor harus mereferensikan kursor yang memungkinkan pembaruan.
OPTION (<query_hint> [ , ...n] )
Kata kunci yang menunjukkan petunjuk pengoptimal mana yang digunakan untuk menyesuaikan cara Mesin Database memproses pernyataan. Untuk informasi selengkapnya, lihat Petunjuk Kueri (Transact-SQL).
Praktik Terbaik
Untuk menghapus semua baris dalam tabel, gunakan TRUNCATE TABLE
. TRUNCATE TABLE
lebih cepat daripada DELETE dan menggunakan lebih sedikit sistem dan sumber daya log transaksi. TRUNCATE TABLE
memiliki batasan, misalnya, tabel tidak dapat berpartisipasi dalam replikasi. Untuk informasi selengkapnya, lihat TRUNCATE TABLE (Transact-SQL)
@@ROWCOUNT
Gunakan fungsi untuk mengembalikan jumlah baris yang dihapus ke aplikasi klien. Untuk informasi selengkapnya, lihat @@ROWCOUNT (Transact-SQL).
Penanganan Kesalahan
Anda dapat menerapkan penanganan kesalahan untuk pernyataan DELETE dengan menentukan pernyataan dalam TRY...CATCH
konstruksi.
Pernyataan DELETE
mungkin gagal jika melanggar pemicu atau mencoba menghapus baris yang direferensikan oleh data dalam tabel lain dengan FOREIGN KEY
batasan. DELETE
Jika menghapus beberapa baris, dan salah satu baris yang dihapus melanggar pemicu atau batasan, pernyataan dibatalkan, kesalahan dikembalikan, dan tidak ada baris yang dihapus.
Ketika pernyataan DELETE mengalami kesalahan aritmatika (luapan, bagi dengan nol, atau kesalahan domain) yang terjadi selama evaluasi ekspresi, Mesin Database menangani kesalahan ini seolah-olah SET ARITHABORT
diatur AKTIF. Sisa batch dibatalkan, dan pesan kesalahan dikembalikan.
Interoperabilitas
DELETE dapat digunakan dalam isi fungsi yang ditentukan pengguna jika objek yang dimodifikasi adalah variabel tabel.
Saat Anda menghapus baris yang berisi kolom FILESTREAM, Anda juga menghapus file sistem file yang mendasar. File yang mendasar dihapus oleh pengumpul sampah FILESTREAM. Untuk informasi selengkapnya, lihat Mengakses Data FILESTREAM dengan Transact-SQL.
Klausa FROM tidak dapat ditentukan dalam pernyataan DELETE yang mereferensikan, baik secara langsung atau tidak langsung, tampilan dengan pemicu yang INSTEAD OF
ditentukan di dalamnya. Untuk informasi selengkapnya tentang ALIH-ALIH pemicu, lihat MEMBUAT PEMICU (Transact-SQL).
Saat ini, klausa FROM tidak dapat ditentukan dalam pernyataan DELETE pada Gudang di Microsoft Fabric.
Batasan dan Pembatasan
Ketika TOP
digunakan dengan DELETE
, baris yang dirujuk tidak diatur dalam urutan apa pun dan ORDER BY
klausul tidak dapat ditentukan secara langsung dalam pernyataan ini. Jika Anda perlu menggunakan TOP untuk menghapus baris dalam urutan kronologis yang bermakna, Anda harus menggunakan TOP
bersama dengan ORDER BY
klausul dalam pernyataan subpilih. Lihat bagian Contoh yang mengikuti topik ini.
TOP
tidak dapat digunakan dalam DELETE
pernyataan terhadap tampilan yang dipartisi.
Perilaku Penguncian
Secara default, DELETE
pernyataan selalu memperoleh kunci eksklusif niat (IX) pada objek tabel dan halaman yang dimodifikasi, kunci eksklusif (X) pada baris yang dimodifikasinya, dan menahan kunci tersebut sampai transaksi selesai.
Dengan kunci eksklusif niat (IX), tidak ada transaksi lain yang dapat memodifikasi kumpulan data yang sama; operasi baca hanya dapat berlangsung dengan penggunaan petunjuk NOLOCK atau membaca tingkat isolasi yang tidak dilakukan. Anda dapat menentukan petunjuk tabel untuk mengambil alih perilaku default ini selama durasi pernyataan DELETE dengan menentukan metode penguncian lain, namun, kami menyarankan agar petunjuk hanya digunakan sebagai upaya terakhir oleh pengembang dan administrator database yang berpengalaman. Untuk informasi selengkapnya, lihat Petunjuk Tabel (Transact-SQL).
Ketika baris dihapus dari timbunan, Mesin Database dapat menggunakan penguncian baris atau halaman untuk operasi. Akibatnya, halaman yang dibuat kosong oleh operasi penghapusan tetap dialokasikan ke timbunan. Ketika halaman kosong tidak dibatalkan alokasinya, ruang terkait tidak dapat digunakan kembali oleh objek lain dalam database.
Untuk menghapus baris dalam tumpukan dan membatalkan alokasi halaman, gunakan salah satu metode berikut.
Tentukan petunjuk TABLOCK dalam pernyataan DELETE. Menggunakan petunjuk TABLOCK menyebabkan operasi penghapusan mengambil kunci IX pada objek alih-alih kunci baris atau halaman. Ini memungkinkan halaman untuk dibatalkan alokasinya. Untuk informasi selengkapnya tentang petunjuk TABLOCK, lihat Petunjuk Tabel (Transact-SQL).
Gunakan
TRUNCATE TABLE
jika semua baris akan dihapus dari tabel.Buat indeks berkluster pada timbunan sebelum menghapus baris. Anda dapat menghilangkan indeks berkluster setelah baris dihapus. Metode ini lebih memakan waktu daripada metode sebelumnya dan menggunakan lebih banyak sumber daya sementara.
Catatan
Halaman kosong dapat dihapus dari tumpukan kapan saja dengan menggunakan ALTER TABLE <table_name> REBUILD
pernyataan .
Perilaku Pengelogan
Pernyataan DELETE selalu dicatat sepenuhnya.
Keamanan
Izin
DELETE
izin diperlukan pada tabel target. SELECT
izin juga diperlukan jika pernyataan berisi klausa WHERE.
Izin DELETE default untuk anggota sysadmin
peran server tetap, db_owner
peran database tetap, dan db_datawriter
pemilik tabel. Anggota sysadmin
, db_owner
, dan db_securityadmin
peran, dan pemilik tabel dapat mentransfer izin ke pengguna lain.
Contoh
Kategori | Elemen sintaksis unggulan |
---|---|
Sintaks dasar | DELETE |
Membatasi baris yang dihapus | WHERE * FROM * cursor * |
Menghapus baris dari tabel jarak jauh | Server tertaut * Fungsi set baris OPENQUERY * Fungsi set baris OPENDATASOURCE |
Menangkap hasil pernyataan DELETE | Klausa OUTPUT |
Sintaks dasar
Contoh di bagian ini menunjukkan fungsionalitas dasar pernyataan DELETE menggunakan sintaks minimum yang diperlukan.
J. Menggunakan DELETE tanpa klausa WHERE
Contoh berikut menghapus semua baris dari SalesPersonQuotaHistory
tabel dalam database AdventureWorks2022 karena klausa WHERE tidak digunakan untuk membatasi jumlah baris yang dihapus.
DELETE FROM Sales.SalesPersonQuotaHistory;
GO
Membatasi Baris Yang Dihapus
Contoh di bagian ini menunjukkan cara membatasi jumlah baris yang akan dihapus.
B. Menggunakan klausa WHERE untuk menghapus sekumpulan baris
Contoh berikut menghapus semua baris dari ProductCostHistory
tabel dalam database AdventureWorks2022 di mana nilai dalam StandardCost
kolom lebih dari 1000.00
.
DELETE FROM Production.ProductCostHistory
WHERE StandardCost > 1000.00;
GO
Contoh berikut menunjukkan klausa WHERE yang lebih kompleks. Klausa WHERE menentukan dua kondisi yang harus dipenuhi untuk menentukan baris yang akan dihapus. Nilai dalam StandardCost
kolom harus antara 12.00
dan 14.00
dan nilai dalam kolom SellEndDate
harus null. Contoh ini juga mencetak nilai dari fungsi @@ROWCOUNT untuk mengembalikan jumlah baris yang dihapus.
DELETE Production.ProductCostHistory
WHERE StandardCost BETWEEN 12.00 AND 14.00
AND EndDate IS NULL;
PRINT 'Number of rows deleted is ' + CAST(@@ROWCOUNT as char(3));
C. Menggunakan kursor untuk menentukan baris yang akan dihapus
Contoh berikut menghapus satu baris dari EmployeePayHistory
tabel dalam database AdventureWorks2022 menggunakan kursor bernama complex_cursor
. Operasi penghapusan hanya memengaruhi satu baris yang saat ini diambil dari kursor.
DECLARE complex_cursor CURSOR FOR
SELECT a.BusinessEntityID
FROM HumanResources.EmployeePayHistory AS a
WHERE RateChangeDate <>
(SELECT MAX(RateChangeDate)
FROM HumanResources.EmployeePayHistory AS b
WHERE a.BusinessEntityID = b.BusinessEntityID) ;
OPEN complex_cursor;
FETCH FROM complex_cursor;
DELETE FROM HumanResources.EmployeePayHistory
WHERE CURRENT OF complex_cursor;
CLOSE complex_cursor;
DEALLOCATE complex_cursor;
GO
D. Menggunakan gabungan dan subkueri ke data dalam satu tabel untuk menghapus baris di tabel lain
Contoh berikut menunjukkan dua cara untuk menghapus baris dalam satu tabel berdasarkan data di tabel lain. Dalam kedua contoh, baris dari SalesPersonQuotaHistory
tabel dalam database AdventureWorks2022 dihapus berdasarkan penjualan tahun ke tanggal yang disimpan dalam SalesPerson
tabel. Pernyataan pertama DELETE
menunjukkan solusi subkueri yang kompatibel dengan ISO, dan pernyataan kedua DELETE
menunjukkan ekstensi Transact-SQL FROM untuk bergabung dengan dua tabel.
-- SQL-2003 Standard subquery
DELETE FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID IN
(SELECT BusinessEntityID
FROM Sales.SalesPerson
WHERE SalesYTD > 2500000.00);
GO
-- Transact-SQL extension
DELETE FROM Sales.SalesPersonQuotaHistory
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER JOIN Sales.SalesPerson AS sp
ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;
GO
-- No need to mention target table more than once.
DELETE spqh
FROM
Sales.SalesPersonQuotaHistory AS spqh
INNER JOIN Sales.SalesPerson AS sp
ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;
E. Menggunakan TOP untuk membatasi jumlah baris yang dihapus
Ketika klausa TOP (n) digunakan dengan DELETE, operasi penghapusan dilakukan pada pilihan acak n jumlah baris. Contoh berikut menghapus 20
baris acak dari PurchaseOrderDetail
tabel dalam database AdventureWorks2022 yang memiliki tanggal jatuh tempo yang lebih awal dari 1 Juli 2006.
DELETE TOP (20)
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO
Jika Anda harus menggunakan TOP untuk menghapus baris dalam urutan kronologis yang bermakna, Anda harus menggunakan TOP bersama dengan ORDER BY dalam pernyataan subpilih. Kueri berikut menghapus 10 baris PurchaseOrderDetail
tabel yang memiliki tanggal jatuh tempo paling awal. Untuk memastikan bahwa hanya 10 baris yang dihapus, kolom yang ditentukan dalam pernyataan subpilih (PurchaseOrderID
) adalah kunci utama tabel. Menggunakan kolom non-kunci dalam pernyataan subpilih dapat mengakibatkan penghapusan lebih dari 10 baris jika kolom yang ditentukan berisi nilai duplikat.
DELETE FROM Purchasing.PurchaseOrderDetail
WHERE PurchaseOrderDetailID IN
(SELECT TOP 10 PurchaseOrderDetailID
FROM Purchasing.PurchaseOrderDetail
ORDER BY DueDate ASC);
GO
Menghapus Baris Dari Tabel Jarak Jauh
Contoh di bagian ini menunjukkan cara menghapus baris dari tabel jarak jauh dengan menggunakan server tertaut atau fungsi set baris untuk mereferensikan tabel jarak jauh. Tabel jarak jauh ada di server atau instans SQL Server yang berbeda.
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.
F. Menghapus data dari tabel jarak jauh dengan menggunakan server tertaut
Contoh berikut menghapus baris dari tabel jarak jauh. Contoh dimulai dengan membuat tautan ke sumber data jarak jauh dengan menggunakan sp_addlinkedserver. Nama server tertaut, MyLinkServer
, kemudian ditentukan sebagai bagian dari nama objek empat bagian dalam form server.catalog.schema.object.
USE master;
GO
-- Create a link to the remote data source.
-- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_name'.
EXEC sp_addlinkedserver @server = N'MyLinkServer',
@srvproduct = N' ',
@provider = N'SQLNCLI',
@datasrc = N'server_name',
@catalog = N'AdventureWorks2022';
GO
-- Specify the remote data source using a four-part name
-- in the form linked_server.catalog.schema.object.
DELETE MyLinkServer.AdventureWorks2022.HumanResources.Department
WHERE DepartmentID > 16;
GO
G. Menghapus data dari tabel jarak jauh dengan menggunakan fungsi OPENQUERY
Contoh berikut menghapus baris dari tabel jarak jauh dengan menentukan fungsi set baris OPENQUERY . Nama server tertaut yang dibuat dalam contoh sebelumnya digunakan dalam contoh ini.
DELETE OPENQUERY (MyLinkServer, 'SELECT Name, GroupName
FROM AdventureWorks2022.HumanResources.Department
WHERE DepartmentID = 18');
GO
H. Menghapus data dari tabel jarak jauh dengan menggunakan fungsi OPENDATASOURCE
Contoh berikut menghapus baris dari tabel jarak jauh dengan menentukan fungsi set baris OPENDATASOURCE . Tentukan nama server yang valid untuk sumber data dengan menggunakan format server_name atau server_name\instance_name.
DELETE FROM OPENDATASOURCE('SQLNCLI',
'Data Source= <server_name>; Integrated Security=SSPI')
.AdventureWorks2022.HumanResources.Department
WHERE DepartmentID = 17;
Menangkap hasil pernyataan DELETE
I. Menggunakan DELETE dengan klausa OUTPUT
Contoh berikut menunjukkan cara menyimpan hasil DELETE
pernyataan ke variabel tabel dalam database AdventureWorks2022.
DELETE Sales.ShoppingCartItem
OUTPUT DELETED.*
WHERE ShoppingCartID = 20621;
--Verify the rows in the table matching the WHERE clause have been deleted.
SELECT COUNT(*) AS [Rows in Table]
FROM Sales.ShoppingCartItem
WHERE ShoppingCartID = 20621;
GO
j. Menggunakan OUTPUT dengan <from_table_name> dalam pernyataan DELETE
Contoh berikut menghapus baris dalam ProductProductPhoto
tabel dalam database AdventureWorks2022 berdasarkan kriteria pencarian yang ditentukan dalam FROM
klausul DELETE
pernyataan. Klausa OUTPUT
mengembalikan kolom dari tabel yang sedang dihapus, DELETED.ProductID
, DELETED.ProductPhotoID
, dan kolom dari Product
tabel. Ini digunakan dalam FROM
klausul untuk menentukan baris yang akan dihapus.
DECLARE @MyTableVar table (
ProductID int NOT NULL,
ProductName nvarchar(50)NOT NULL,
ProductModelID int NOT NULL,
PhotoID int NOT NULL);
DELETE Production.ProductProductPhoto
OUTPUT DELETED.ProductID,
p.Name,
p.ProductModelID,
DELETED.ProductPhotoID
INTO @MyTableVar
FROM Production.ProductProductPhoto AS ph
JOIN Production.Product as p
ON ph.ProductID = p.ProductID
WHERE p.ProductModelID BETWEEN 120 and 130;
--Display the results of the table variable.
SELECT ProductID, ProductName, ProductModelID, PhotoID
FROM @MyTableVar
ORDER BY ProductModelID;
GO
Contoh: Azure Synapse Analytics and Analytics Platform System (PDW)
K. Menghapus semua baris dari tabel
Contoh berikut menghapus semua baris dari Table1
tabel karena klausa WHERE tidak digunakan untuk membatasi jumlah baris yang dihapus.
DELETE FROM Table1;
L. MENGHAPUS sekumpulan baris dari tabel
Contoh berikut menghapus semua baris dari Table1
tabel yang memiliki nilai lebih besar dari 1000.00 di StandardCost
kolom.
DELETE FROM Table1
WHERE StandardCost > 1000.00;
M. Menggunakan LABEL dengan pernyataan DELETE
Contoh berikut menggunakan label dengan pernyataan DELETE.
DELETE FROM Table1
OPTION ( LABEL = N'label1' );
N. Menggunakan label dan petunjuk kueri dengan pernyataan DELETE
Kueri ini memperlihatkan sintaks dasar untuk menggunakan petunjuk gabungan kueri dengan pernyataan DELETE. Untuk informasi selengkapnya tentang petunjuk gabungan dan cara menggunakan klausa OPTION, lihat Klausa OPTION (Transact-SQL).
-- Uses AdventureWorks
DELETE FROM dbo.FactInternetSales
WHERE ProductKey IN (
SELECT T1.ProductKey FROM dbo.DimProduct T1
JOIN dbo.DimProductSubcategory T2
ON T1.ProductSubcategoryKey = T2.ProductSubcategoryKey
WHERE T2.EnglishProductSubcategoryName = 'Road Bikes' )
OPTION ( LABEL = N'CustomJoin', HASH JOIN ) ;
O. Menghapus menggunakan klausa WHERE
Kueri ini memperlihatkan cara menghapus menggunakan klausa WHERE dan tidak menggunakan klausa FROM.
DELETE tableA WHERE EXISTS (
SELECT TOP 1 1 FROM tableB tb WHERE tb.col1 = tableA.col1
)
P. Hapus berdasarkan hasil bergabung dengan tabel lain
Contoh ini memperlihatkan cara menghapus dari tabel berdasarkan hasil dari bergabung dengan tabel lain.
CREATE TABLE dbo.Table1
(ColA int NOT NULL, ColB decimal(10,3) NOT NULL);
GO
CREATE TABLE dbo.Table2
(ColA int PRIMARY KEY NOT NULL, ColB decimal(10,3) NOT NULL);
GO
INSERT INTO dbo.Table1 VALUES(1, 10.0), (1, 20.0);
INSERT INTO dbo.Table2 VALUES(1, 0.0);
GO
DELETE dbo.Table2
FROM dbo.Table2
INNER JOIN dbo.Table1
ON (dbo.Table2.ColA = dbo.Table1.ColA)
WHERE dbo.Table2.ColA = 1;
Lihat Juga
BUAT PEMICU (Transact-SQL)
INSERT (Transact-SQL)
SELECT (Transact-SQL)
POTONG TABEL (Transact-SQL)
UPDATE (Transact-SQL)
DENGAN common_table_expression (T-SQL)
@@ROWCOUNT (T-SQL)