【问题标题】:Remove rows where id not in (very large) list - Best practice?删除 id 不在(非常大)列表中的行 - 最佳实践?
【发布时间】:2017-09-01 09:54:00
【问题描述】:

我想知道当您有大量 id 列表并且您需要删除列表中不包含 id 的行时,最佳做法是什么。

在我看来,要走的路是使用“不在”功能:

DELETE FROM Foo  
WHERE ID NOT IN (1, 2, 3,... 20000)

但当您的列表很大时,我不确定此解决方案的性能是否符合要求。

有没有其他方法的建议?

【问题讨论】:

  • 填一张临时表
  • ..并且使用不存在?
  • 可以详细说明吗?
  • 在不存在的情况下从 Foo 中删除一个 (SELECT 1 FROM #tbl_temp WHERE id_temp = a.id);
  • 你有这个整数列表的格式。你有它在字符串变量还是XML中

标签: sql-server


【解决方案1】:

您可以创建并填充一个临时表,然后使用NOT INNOT EXISTSLEFT OUTER JOIN

CREATE TABLE #foo(id INT)

INSERT #foo VALUES(1)
INSERT #foo VALUES(2)
INSERT #foo VALUES(3)
INSERT #foo VALUES(4)
INSERT #foo VALUES(5)
INSERT #foo VALUES(6)
INSERT #foo VALUES(20000)

WHILE @@rowcount > 0
BEGIN 
   DELETE TOP (100) FROM Foo WHERE NOT EXISTS (SELECT 1 FROM #foo f WHERE f.Id = Foo.ID )
END 

相关:How would I create a temp table in SQL Server when I have a big list of ID's

【讨论】:

  • 为什么是while循环?
  • @Amit: 不需要,如果表太大的话可以批量删除
  • 确保临时表中有索引,甚至更好的主键。
  • 你不能也使用循环来填写“其中 ID 不在 (1, 2, ...) 中”,这样你就可以将“不在 ()”中始终限制为最大 100身份证?
猜你喜欢
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多