自引用表时删除数据

问题描述 投票:0回答:3

我试图清理MySQL表中的数据时遇到了问题。问题是我们需要使用子查询中的表来确定需要删除的内容。

DELETE 
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN (
  SELECT person.person_ref
  FROM person
  JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
  WHERE dates.date < CURDATE()
)

Subquery为所有人提供了比今天更早的日期。事件引用列表是我们要删除的事件列表,其中不包括event_ref = 14

将查询视为SELECT将返回我们想要删除的所有内容,但MySQL在尝试使用删除时会抱怨。

我真的不想创建一个视图来引用上面的查询,因为清理是一次性事件

mysql sql-delete
3个回答
1
投票

首先让我们缩短查询。你可以在这里摆脱person表;你没有做任何事情。

DELETE 
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN
(
  SELECT person_ref
  FROM dates 
  WHERE event_ref = 14 AND date < CURDATE()
);

现在MySQL不喜欢直接访问它正在删除的表。在MySQL中,你必须将表包装在伪子查询中:

DELETE 
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN
(
  SELECT person_ref
  FROM (SELECT * FROM dates) d
  WHERE event_ref = 14 AND date < CURDATE()
);

0
投票

您可以使用子查询:

DELETE 
FROM dates
WHERE event_ref IN (*list of event_refs*)
AND person_ref IN (SELECT person_ref FROM (
  SELECT person.person_ref
  FROM person
  JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
  WHERE dates.date < CURDATE()) sub
)

0
投票

您可以在同一个表的子查询上使用内部联接

    DELETE dates FROM dates
    INNER JOIN (
          SELECT person.person_ref
      FROM person
      JOIN dates ON dates.person_ref = person.person_ref AND dates.event_ref = 14
      WHERE dates.date < CURDATE()) sub
    ) t on t.person_ref = dates. person_ref
    AND  event_ref IN (*list of event_refs*)
© www.soinside.com 2019 - 2024. All rights reserved.