使用T-SQL高效删除记录,而不使用IN子句

10 浏览
0 Comments

使用T-SQL高效删除记录,而不使用IN子句

有没有一种高效的方法在以下场景中从SQL Server中删除记录,而不使用关键字IN

-- If Documents were deleted, remove them from your ocean
DELETE FROM IndexHistory 
WHERE DocId IN (SELECT IH.Docid 
                FROM IndexHistory IH 
                LEFT JOIN IndexedLineItems I ON IH.Docid = I.DocId
                WHERE I.Docid IS NULL)

如果您研究这种情况,您将在括号内找到要从查询中删除的所有记录。

已经有证实了使用“IN”是低效的事实。因此,我们应该认为,在不使用“IN”的情况下删除它们是有可能的,因为可以使用“IN”之外的方式进行识别。

例如,我认为可能会出现这样的情况,但我没有正确的语法:

DELETE FROM IndexHistory IH 
LEFT JOIN IndexedLineItems I ON IH.Docid = I.DocId
WHERE I.Docid IS NULL

我意识到答案可能仍然是“不可能”。

如果不可能,也许可以建议Microsoft改进语言。在我这样做之前,我想在这里发布以查看是否遗漏了什么。

admin 更改状态以发布 2023年5月20日
0
0 Comments

出于可读性的原因,我更喜欢使用CTE,它也可以更改为使用SELECT来查看我将要删除的内容。这个NOT EXISTS可能也更有效率:

WITH DeleteData AS
(
  SELECT IH.Docid 
  FROM IndexHistory IH 
  WHERE NOT EXISTS( SELECT 1 FROM IndexedLineItems I
                    WHERE I.DocId = IH.DocId)
)
DELETE FROM DeleteData

你不需要从这个CTE到表中再进行额外的JOIN,因为只选择了一张表。

0
0 Comments

使用not exists: \n

Delete ih from IndexHistory ih
    where not exists (select 1 from IndexedLineItems ili where ih.Docid = ili.DocId)

0