ВЫБЕРИТЕ и УДАЛИТЕ - PullRequest
       8

ВЫБЕРИТЕ и УДАЛИТЕ

2 голосов
/ 31 августа 2010

Мне нужно удалить определенные строки из таблицы.Какие строки должны быть удалены - это то, что я выясняю с помощью запроса.Однако похоже, что вы не можете выполнить обе операции (выбрать и удалить) в одном запросе :

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

Так что я не могу сделать это:

DELETE
FROM telefono
WHERE telefono_id IN (
    SELECT te.telefono_id
    FROM telefono te
    LEFT JOIN centro_telefono ce ON te.telefono_id=ce.telefono_id AND ce.telefono_id IS NOT NULL
    LEFT JOIN contacto_telefono co ON te.telefono_id=co.telefono_id AND co.telefono_id IS NOT NULL
    WHERE COALESCE(ce.telefono_id, co.telefono_id) IS NULL AND te.fecha_alta < DATE_SUB(NOW(), INTERVAL 1 DAY)
);
-- SQL Error (1093): You can't specify target table for update in FROM clause

Как я могу реализовать очистку этой записи в чистом MySQL?

Сервер работает MySQL5.1.39.

Ответы [ 3 ]

1 голос
/ 31 августа 2010

Попробуйте выполнить оператор удаления с объединениями

DELETE te
FROM telefono as te
    LEFT JOIN centro_telefono ce
        ON te.telefono_id=ce.telefono_id AND ce.telefono_id IS NOT NULL
    LEFT JOIN contacto_telefono co
        ON te.telefono_id=co.telefono_id AND co.telefono_id IS NOT NULL
WHERE
    COALESCE(ce.telefono_id, co.telefono_id) IS NULL
    AND te.fecha_alta < DATE_SUB(NOW(), INTERVAL 1 DAY)
1 голос
/ 31 августа 2010
 CREATE TEMPORARY TABLE tmptable
 SELECT te.telefono_id
 FROM telefono te
  LEFT JOIN centro_telefono ce ON te.telefono_id=ce.telefono_id AND ce.telefono_id IS NOT NULL
  LEFT JOIN contacto_telefono co ON te.telefono_id=co.telefono_id AND co.telefono_id IS NOT NULL
  WHERE COALESCE(ce.telefono_id, co.telefono_id) IS NULL AND te.fecha_alta < DATE_SUB(NOW(), INTERVAL 1 DAY)

 DELETE FROM telefono te
 WHERE te.telefono_id IN (Select telefono_id from tmptable)
0 голосов
/ 31 августа 2010

Используйте UPDATE, чтобы отметить строки для удаления, затем DELETE, чтобы фактически удалить их.

UPDATE telefono SET marker_column='DELETE ME!!!!' WHERE telefono_id IN (...);
DELETE FROM telefono WHERE marker_column='DELETE ME!!!!';
...