Saya menggunakan ini
DELETE TableA
FROM TableA a
INNER JOIN
TableB b on b.Bid = a.Bid
AND [condition]
dan cara @TheTXI cukup baik tetapi saya membaca jawaban dan komentar dan saya menemukan satu hal yang harus dijawab adalah menggunakan kondisi dalam klausa WHERE atau sebagai kondisi bergabung. Jadi saya memutuskan untuk mengujinya dan menulis cuplikan tetapi tidak menemukan perbedaan yang berarti di antara mereka. Anda dapat melihat skrip sql di sini dan poin pentingnya adalah bahwa saya lebih suka menuliskannya sebagai commnet karena ini bukan jawaban yang pasti tetapi besar dan tidak dapat dimasukkan ke dalam komentar, maafkan saya.
Declare @TableA Table
(
aId INT,
aName VARCHAR(50),
bId INT
)
Declare @TableB Table
(
bId INT,
bName VARCHAR(50)
)
Declare @TableC Table
(
cId INT,
cName VARCHAR(50),
dId INT
)
Declare @TableD Table
(
dId INT,
dName VARCHAR(50)
)
DECLARE @StartTime DATETIME;
SELECT @startTime = GETDATE();
DECLARE @i INT;
SET @i = 1;
WHILE @i < 1000000
BEGIN
INSERT INTO @TableB VALUES(@i, 'nameB:' + CONVERT(VARCHAR, @i))
INSERT INTO @TableA VALUES(@i+5, 'nameA:' + CONVERT(VARCHAR, @i+5), @i)
SET @i = @i + 1;
END
SELECT @startTime = GETDATE()
DELETE a
--SELECT *
FROM @TableA a
Inner Join @TableB b
ON a.BId = b.BId
WHERE a.aName LIKE '%5'
SELECT Duration = DATEDIFF(ms,@StartTime,GETDATE())
SET @i = 1;
WHILE @i < 1000000
BEGIN
INSERT INTO @TableD VALUES(@i, 'nameB:' + CONVERT(VARCHAR, @i))
INSERT INTO @TableC VALUES(@i+5, 'nameA:' + CONVERT(VARCHAR, @i+5), @i)
SET @i = @i + 1;
END
SELECT @startTime = GETDATE()
DELETE c
--SELECT *
FROM @TableC c
Inner Join @TableD d
ON c.DId = d.DId
AND c.cName LIKE '%5'
SELECT Duration = DATEDIFF(ms,@StartTime,GETDATE())
Jika Anda bisa mendapatkan alasan yang bagus dari skrip ini atau menulis yang bermanfaat lainnya, silakan bagikan. Terima kasih dan harap bantuan ini.