Sql 子查询中具有Union的Delete语句将不起作用

Sql 子查询中具有Union的Delete语句将不起作用,sql,sql-server-2008,Sql,Sql Server 2008,我有一个带有Union语句的查询,其中检索表Orders的Requester&Provider列中存在的所有用户标识 现在我有了一个名为“Persons”的表,其中的用户ID链接到Persons数据。 使用上面的查询,我希望清理这个表,只保留上面union语句结果中存在的用户标识 因此,我做了以下删除声明: DELETE FROM Persons WHERE UserId NOT IN( SELECT Requester FROM Orders UNION SELECT Provider F

我有一个带有Union语句的查询,其中检索表Orders的Requester&Provider列中存在的所有用户标识

现在我有了一个名为“Persons”的表,其中的用户ID链接到Persons数据。 使用上面的查询,我希望清理这个表,只保留上面union语句结果中存在的用户标识

因此,我做了以下删除声明:

DELETE FROM
Persons
WHERE
UserId NOT IN(

SELECT Requester
FROM Orders
UNION 
SELECT Provider
FROM Orders
)
然而,即使在等待5分钟后,该查询仍拒绝执行。我的查询失败的原因可能是什么?我不允许在这里的子查询中使用UNION as语句吗

注:
下面的问题对我来说并没有解决。

查询有效。只是需要很长时间。也许以下措施更有效:

DELETE FROM Persons
    WHERE UserId NOT IN (SELECT DocAuthor FROM Document WHERE DocAuthors IS NOT NULL) AND
          UserId NOT IN (SELECT DocActualApprovers FROM Document WHERE DocActualApprovers IS NOT NULL);
然后,为了提高性能,最好至少有两个索引:DocumentDocAuthor和DocAuthorDocActualApprovers。请注意,如果DocAuthor或DocActualProvers为空,则原始查询将不删除任何内容。想必,这不是你想要的;因此,where子句

编辑:

您可能会发现not exists的工作速度更快:

DELETE FROM Persons p
    WHERE NOT EXISTS (SELECT DocAuthor FROM Document d WHERE d.DocAuthor = p.UserId) AND
          NOT EXISTS (SELECT DocActualApprovers FROM Document WHERE d.DocActualApprovers = p.UserId);

同样的索引在这里也会有所帮助。

当您将“删除自”替换为“选择*自”时会发生什么?另一种方法-将联合查询的结果存储在临时表中,并在“delete”查询中使用该结果。速度非常慢。但却产生了结果。可能是因为我过度扩展了In语句吗?谢谢你给我指出了“空”问题!您的查询工作正常,但仍然很慢。不知怎的,我觉得这句话损害了我的表现
DELETE FROM Persons p
    WHERE NOT EXISTS (SELECT DocAuthor FROM Document d WHERE d.DocAuthor = p.UserId) AND
          NOT EXISTS (SELECT DocActualApprovers FROM Document WHERE d.DocActualApprovers = p.UserId);