我有Union-Statement
的查询,其中我检索了UserIds
&中存在的所有Requester
。 Provider
订单的Column
table
。
SELECT Requester
FROM Orders
UNION
SELECT Provider
FROM Orders
This query yields some 7000 results in under a second.
现在我有一个名为“Persons
”的表,其中UserIds
为linked 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没有为我解决。
答案 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)
。请注意,如果DocAuthor
或DocActualApprovers
始终为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);
相同的索引在这里会有所帮助。