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

标签 sql-server tsql syntax subquery

是否有一种不使用关键字 IN 从 SQL Server 中删除记录的有效方法?在以下场景中:

-- 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 语言的建议。在我这样做之前,我想我会在这里发帖看看我是否遗漏了什么。

最佳答案

使用 not exists :

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

关于sql-server - 使用 T-SQL 高效删除记录而不使用 IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52724731/

相关文章:

sql - 返回存储过程中 OUTPUT 参数的值

sql - IF block 在条件不适用时执行

sql-server - SQL Server : Maximum number of records to return

MySQL 分号在过程中的位置

php - PHP 中二进制文件的前缀是什么?

php - 无效查询 : You have an error in your SQL syntax; syntax to use near

sql - 更新闭包表的最佳方法是什么?

c# - Entity Framework 创建了一个我不想要的表

php - 无法连接到 PHP 中的 SSRS

sql - 识别具有不一致关系的记录