Удалить данные при самообращении к таблице

0

У меня возникла проблема с попыткой очистки данных из таблицы 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 дает всем людям с датой раньше, чем сегодня. Список событий refs - это список событий, которые мы хотим удалить, и который исключает event_ref = 14

Обработка запроса как SELECT возвращает все, что мы хотим удалить, но MySQL жалуется при попытке использовать удаление.

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

  • 0
    "но 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
    Хорошее место Таблица персонала осталась от какой-то другой уборки, которую мы делаем, но в этом случае можно пойти. Проверим отдых понедельника утра
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*)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню