Вопрос № 29523: Просьба ко всем специалистам по SQL. Есть две таблицы t1 и t2, в которых общие поля id. Как составить запрос, который удаляет из таблицы t1 строки с теми id, которые отсутствуют в таблице t2. Классический синтаксис такой: DELETE FROM t1 WHERE id <...
Вопрос № 29.523
Просьба ко всем специалистам по SQL. Есть две таблицы t1 и t2, в которых общие поля id. Как составить запрос, который удаляет из таблицы t1 строки с теми id, которые отсутствуют в таблице t2. Классический синтаксис такой: DELETE FROM t1 WHERE id <>(SELECT id FROM t2) Так написано в учебнике, но в MYSQL v 3.23.56 не работает
Отвечает: Андрей_26rus
Здравствуйте, Шапошников Игорь!
DELETE FROM t1 WHERE id <>(SELECT id FROM t2)
в данном случае (SELECT id FROM t2) возвращает не одно значение,
нельзя сравнить значение id(одно значение) с одной стороны и id(множество значений) с другой стороны, данный запрос бутет верным если (SELECT id FROM t2) вернет одно единственное значение, лучше проверить существует ли в t2 такая запись, что t2.id = t1.id, и если нет то удалить из t1 запись с таким id, получим запрос:
delete from t1 where not exists(select id from t2 where t2.id = t1.id)
--------- - = Tertium non datur = -
Ответ отправил: Андрей_26rus (статус: 1-ый класс)
Отправлен: 14.11.2005, 14:55
Отвечает: Lector
Здравствуйте, Шапошников Игорь!
Попытался сделать с left join - не получилось.
Другие варианты:
сначала сделай выборку по id второй таблицы, а потом подставь её в запрос
!перейди на mysql 5.* и будет тебе счастье, ведь она поддерживает вложенные запросы.
--------- Хочешь помочь старику - сделай вместо него. Хочешь помочь новичку - сделай вместе с ним. Хочешь помочь мастеру - отойди и не мешай, а хочешь помочь дураку - сам дурак.
Ответ отправил: Lector (статус: 9-ый класс)
Отправлен: 14.11.2005, 14:57
Отвечает: Дмитрий Иванов
Здравствуйте, Шапошников Игорь!
Уже не помню работает ли LEFT JOIN в v.3 но:
delete from t1 left join t2 on tab1.id=t2.ID where t2.id is NULL
или как говорят в MySQL:
CREATE TEMPORARY TABLE tmptable
SELECT t1.* FROM t1
LEFT JOIN t2 ON t2.id = t1.id
WHERE t2.id is NULL;
DELETE FROM t1 USING tmptable, t1
WHERE table.id = tmptable.id;
--------- ставя оценку - подумай, может ты не все описал.
Ответ отправил: Дмитрий Иванов (статус: 5-ый класс)
Отправлен: 14.11.2005, 16:54
Отвечает: RedDevil
Здравствуйте, Шапошников Игорь!
Дело в том, что вы используете подзапросы, а они поддерживаются MySQL начиная с версии 4.1. Так что www.mysql.org и качайте новую версию.
Ответ отправил: RedDevil (статус: 1-ый класс)
Отправлен: 15.11.2005, 06:11