Sql 子查询中具有Union的Delete语句将不起作用
我有一个带有Union语句的查询,其中检索表Orders的Requester&Provider列中存在的所有用户标识 现在我有了一个名为“Persons”的表,其中的用户ID链接到Persons数据。 使用上面的查询,我希望清理这个表,只保留上面union语句结果中存在的用户标识 因此,我做了以下删除声明: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
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);