【问题标题】:Delete-Statement with Union in subquery won't work子查询中带有联合的删除语句不起作用
【发布时间】:2014-10-30 10:26:49
【问题描述】:

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

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。 使用上面的查询,我想清理这个表,只保留上面联合语句结果中存在的 UserId。

所以我做了以下删除语句:

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 并没有为我解决问题。

【问题讨论】:

  • 当您将 'delete from' 替换为 'select * from' 时会发生什么?另一种方法 - 将联合查询的结果存储在临时表中并在“删除”查询中使用。
  • 慢得要命。而是产生了结果。可能是因为我过度扩展了In statement?

标签: sql sql-server-2008


【解决方案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);

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

【讨论】:

  • 感谢您指出“空”问题!您的查询有效,但仍然很慢。不知何故,我觉得IN-statement正在损害我的表现
猜你喜欢
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
相关资源
最近更新 更多