子查询中带有Union的Delete-Statement将不起作用

时间:2014-10-30 10:26:49

标签: sql sql-server-2008

我有Union-Statement的查询,其中我检索了UserIds&中存在的所有RequesterProvider订单的Column table

SELECT Requester
FROM Orders
UNION 
SELECT Provider
FROM Orders

This query yields some 7000 results in under a second.

现在我有一个名为“Persons”的表,其中UserIdslinked to the persons data。 使用上面的查询我想清理这个表,只保留上面union-statement结果中出现的UserIds。

所以我做了以下delete语句:

DELETE FROM
Persons
WHERE
UserId NOT IN(

SELECT Requester
FROM Orders
UNION 
SELECT Provider
FROM Orders
)

然而,这个查询拒绝执行(即使在等待5分钟后)。我的查询失败的原因是什么?我不允许在子查询中使用UNION作为Statement吗?

注意: 以下MySQL DELETE FROM with UNION subquery by IN condition没有为我解决。

1 个答案:

答案 0 :(得分:1)

查询有效。这需要很长时间。也许以下内容会更有效:

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);

然后,为了提高性能,最好有(至少)两个索引:Document(DocAuthor)DocAuthor(DocActualApprovers)。请注意,如果DocAuthorDocActualApprovers始终为NULL,原始查询将不会删除任何内容。据推测,这不是你想要的;因此,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);

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