Ich benutze das
DELETE TableA
FROM TableA a
INNER JOIN
TableB b on b.Bid = a.Bid
AND [condition]
und @TheTXI Weg ist so gut wie genug, aber ich habe Antworten und Kommentare gelesen und festgestellt, dass eine Sache, die beantwortet werden muss, die Verwendung der Bedingung in der WHERE-Klausel oder als Join-Bedingung ist. Also beschloss ich, es zu testen und ein Snippet zu schreiben, fand aber keinen bedeutenden Unterschied zwischen ihnen. Sie können SQL-Skript hier sehen und wichtiger Punkt ist, dass ich es vorgezogen habe, es als Commnet zu schreiben, da dies keine genaue Antwort ist, aber es ist groß und kann nicht in Kommentare eingefügt werden, bitte entschuldigen Sie mich.
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())
Wenn Sie einen guten Grund für dieses Skript haben oder ein anderes nützliches schreiben könnten, teilen Sie es uns bitte mit. Danke und hoffe diese Hilfe.