2014-10-30 95 views
0

我有一个查询与Union-Statement,我检索所有UserIds它们存在于table订单Requester & ProviderColumn删除,声明与联盟将无法正常工作

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 FROM 
Persons 
WHERE 
UserId NOT IN(

SELECT Requester 
FROM Orders 
UNION 
SELECT Provider 
FROM Orders 
) 

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

注: 以下MySQL DELETE FROM with UNION subquery by IN condition没有解决它对我来说。

+0

将'delete from'替换为'select * from'会发生什么?另一种方法 - 将联合查询的结果存储在临时表中,并在'删除'查询中使用它。 – 2014-10-30 10:33:48

+0

慢下来。但产生的结果。难道是因为我过度使用'In'语句? – User999999 2014-10-30 10:36:21

回答

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)。请注意,如果DocAuthorDocActualApproversNULL,您的原始查询将不会删除任何内容。据推测,这不是你想要的;因此,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); 

同样的指标将有助于在这里。

+0

谢谢你指出我''无'问题!您的查询有效,但仍然很慢。不知何故,我觉得像'陈述'是伤害我的表现 – User999999 2014-10-30 10:39:03