Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / delete from X where aa in (select aa from X) - неужели так нельзя? / 8 сообщений из 8, страница 1 из 1
09.10.2013, 00:01:58
    #38420963
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
delete from X where aa in (select aa from X) - неужели так нельзя?
MySQL 5.5
Запускаю запрос типа:
Код: sql
1.
delete from X where aa in (select aa from X)


и получаю:
You can't specify target table 'X' for update in FROM clause
но почему? Ведь вначале вычисляются значения (select aa from X), а потом они уже удаляются.

Вместо (select aa from X) у меня в реальности более сложная конструкция с группировками и подзапросами, но даже если урезаю конструкцию до такой строки то ругается.

Тоесть выходит я не могу удалить данные из таблицы если что удалять расчитываю в ней же?
...
Рейтинг: 0 / 0
09.10.2013, 00:50:35
    #38420976
sqlinfo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
delete from X where aa in (select aa from X) - неужели так нельзя?
...
Рейтинг: 0 / 0
09.10.2013, 00:51:55
    #38420977
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
delete from X where aa in (select aa from X) - неужели так нельзя?
Лучше покажи оригинальный запрос, и с ним разбирайся, как его переписать.

Принципиально так делать можно, но MySQL почему-то так не умеет.
...
Рейтинг: 0 / 0
09.10.2013, 00:52:39
    #38420978
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
delete from X where aa in (select aa from X) - неужели так нельзя?
Пробывал:
Код: sql
1.
2.
3.
delete X.*,
(select aa from X) T1
where X.aa=T1.aa


отлично отрабатывает за 2 секунды.
Но при усилении запроса до:
Код: sql
1.
2.
3.
4.
delete X.*,
(select aa from X) T1
(select bb from X) T2
where X.aa=T1.aa or X.bb=T2.bb


более чем за 1 час операция так и НЕ выполняется...
...
Рейтинг: 0 / 0
09.10.2013, 01:06:12
    #38420980
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
delete from X where aa in (select aa from X) - неужели так нельзя?
Спасибо sqlinfo , действительно помогло увеличи конструкцию на дополнительный select * до
Код: sql
1.
delete from X where aa in (select aa (select aa from X) as T1)

после чего MySQL считает что данные ищет не в X, а в T1.
...
Рейтинг: 0 / 0
09.10.2013, 01:08:32
    #38420983
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
delete from X where aa in (select aa from X) - неужели так нельзя?
И более тяжолый запрос теперь выглядит как
Код: sql
1.
2.
3.
4.
delete from X where 
aa in (select aa (select aa from X) as T1)
or
bb in (select bb (select bb from X) as T2)

причём выполняется за теже самые 2 секунды
...
Рейтинг: 0 / 0
09.10.2013, 12:37:11
    #38421373
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
delete from X where aa in (select aa from X) - неужели так нельзя?
Код: sql
1.
(select aa (select aa from X) as T1)

тут слово FROM не пропущено?
...
Рейтинг: 0 / 0
09.10.2013, 14:52:25
    #38421634
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
delete from X where aa in (select aa from X) - неужели так нельзя?
Я прошу прощения, действительно при копировании забыл FROM!

За одно поделюсь и ещё двумя замечаниями:

1) при такой инкапсуляции совсем не обязательно писать название полей, тоесть вместо:
Код: plaintext
...in (select  aa  from (...
можно писать
Код: plaintext
...in (select  *  from (...
ведь имя поля этот select возьмёт из внутренней таблицы

2) совсем не обязательно обеим таблицам при такой инкапсуляции давать разные псевдонимы, тоесть вместо:
Код: plaintext
...) as T1)
Код: plaintext
...) as T2)
можно было обеим дать один псевданим, скажем:
Код: plaintext
...) as T)
главно что MySQL уже не считает что мы делаем выборку и удаление из одной таблицы.

Таким образом мы приходим к тому что сколько бы нибыло условий удаления, все они для работы могу инкапсулироваться в полностью одинаковую конструкцию типа:
Код: sql
1.
(select * from (...) as T)



Итого конечный результат выглядит:
Код: sql
1.
2.
3.
4.
delete from X where 
aa in (select * from (select aa from X) as T)
or
bb in (select * from (select bb from X) as T)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / delete from X where aa in (select aa from X) - неужели так нельзя? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]