删除且不在查询中

Joh*_*ohn 0 sql t-sql sql-server

我有以下表结构:

用户数

  • UserId(主键)
  • 用户名

SomeItems

  • SomeId(从FK到Users.UserId)
  • SomeItemId(主键)
  • 名称
  • 其他的东西...

其他项目

  • SomeId2(FK到Users.UserId)
  • SomeOtherItemId(主键)
  • 名称
  • 其他的东西...

我想从Users表中删除SomeItems和SomeOtherItems表中不存在的记录。

我可以做这个:

DELETE from Users
FROM Users u
WHERE u.UserId NOT IN
   (SELECT DISTINCT SomeId FROM SomeItems

    UNION

    SELECT DISTINCT SomeId2 FROM SomeOtherItems)
Run Code Online (Sandbox Code Playgroud)

但是,它非常慢。我假设它为每条记录执行UNION查询,不是吗?有什么办法可以提高性能?

Aar*_*and 6

在两个结果上应用distinct,然后将它们合并(这适用于第三个distinct,所有这些都需要排序),并不是验证存在的最有效方法。怎么样:

DELETE u
  FROM dbo.Users AS u -- always use schema prefix!
  WHERE NOT EXISTS
  (
    SELECT 1 FROM dbo.SomeItems WHERE SomeId = u.UserId
  )
  AND NOT EXISTS
  (
    SELECT 1 FROM dbo.SomeOtherItems WHERE SomeID2 = u.UserId
  );
Run Code Online (Sandbox Code Playgroud)