Удалить данные при самообращении к таблице - PullRequest
0 голосов
/ 14 сентября 2018

Я столкнулся с проблемой, пытаясь очистить данные из таблицы 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 жалуетсяпри попытке использовать удаление.

Я действительно не хочу вдаваться в подробности создания представления для ссылки на приведенный выше запрос, поскольку очистка является одноразовым событием

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Вы можете использовать внутреннее соединение в подзапросе для той же таблицы

    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*)
0 голосов
/ 14 сентября 2018

Сначала давайте сократим запрос.Вы можете избавиться от таблицы 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 голосов
/ 14 сентября 2018

Вы можете использовать подзапрос:

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