SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 02.04.2016 00:30:45

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Error 1093 при коррелированном update

Доброго дня, Коллеги!

Есть таблица t, в ней существенны два поля - transaction_time и nt_id. Поле nt_id хочу пронумеровать по возрастанию transaction_time по возрастанию, от 1 и выше.

Вроде все просто, update с подзапросом, где считаем количество записей, где время отстаёт от текущей.
Однако error 1093, сцуко, не дремлет (.

Лобовой вариант, конечно не шуршит.

UPDATE `t` `bt1` SET `bt1`.`nt_id` = (SELECT count(*) FROM `t` WHERE `transaction_time` > bt1.`transaction_time` );


You can't specify target table 'bt1' for update in FROM clause

Оборачиваем, как рекомендуется классиком, в подзапрос.

UPDATE `t` `bt1` SET `bt1`.`nt_id` = (
SELECT count(*) FROM ( SELECT * FROM `t` WHERE `transaction_time` > bt1.`transaction_time`) t
);


Тот же эффект, увы.

Как обернуть это в джоин-вариант, увы, не соображу, да и не уверен, можно ли.

Можно, конечно, пойти путем создания временной таблицы и проворачиванием через нее, в крайнем случае так и сделаю,
но все же - тут можно как-то исхитриться и сделать запросом?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#2 02.04.2016 00:43:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Error 1093 при коррелированном update

А какая у тебя версия? В новых тривиальный from-подзапрос упрощается, поэтому универсальный вариант не столь и универслаен smile

Имхо, эту задачу лучше решать через переменные, тут даже многотабличный не нужен.

update `bt1` set `nt_id` = (select @i:= @i + 1 from (select @i:= 0) t) order by `transaction_time`;

Неактивен

 

#3 02.04.2016 00:48:57

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Error 1093 при коррелированном update

Новехонькая.. 5.7.9-log.
Спасибо за наводку!

В свете наших последних экспериментов с переменными (ввиду того, что оптимизитор там своевольничает по полной)
я как-то меньше стал им доверять. Этот запрос не должен фокусничать?

В любом случае исключительно интересно - видно ли какое-нибудь решение через подзапрос или джоин?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 02.04.2016 01:02:15

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Error 1093 при коррелированном update

deadka написал:

Этот запрос не должен фокусничать?

имхо, нет.


deadka написал:

В любом случае исключительно интересно - видно ли какое-нибудь решение через подзапрос или джоин?

там зависимый from-подзапрос получается, а они не реализованы.
так что запросом только через переменные

Неактивен

 

#5 02.04.2016 02:27:15

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Error 1093 при коррелированном update

Низкий поклон, Акутогава-сан!

В тему подзапросов еще хочу уточнить такой весчь, насчет потери алиаса на вложенности.

Ситуация наведенная, запрос можно упростить и выкинуть один уровень вложенности, привожу чисто для показа проблемы.

Например:

Есть таблица  с фильмами movie , на нее ссылается likes, там каждая запись являет собой лайк на определенный фильм.
Возникла нам нужда быстро выводить самые лайкаемые фильмы.
Оптимизировать не получается, поэтому денормализуем - добавляем в movie поле count_of_likes.
Хотим его заполнить

UPDATE `movie` m_alias SET count_of_like = ( select count(*) from ( SELECT * FROM `likes` WHERE `movie_id` = m_alias.id ) t );


Получаем

Unknown column 'm_alias.id' in 'where clause'

Вопрос, а можно ли как-то пробрасывать m_alias на один уровень глубже?

P. S. Естественно, можно так:

UPDATE `movie` m_alias SET count_of_like = ( SELECT count(*) FROM `likes` WHERE `movie_id` = m_alias.id );


Просто разместил иллюстрацию, на самом деле такое встречал, что нужно доступаться к алиасу из вложенного подзапроса,
поэтому прошу изойти из того, что по каким-то неведомым причинам не можем мы применить запрос из постскриптума )).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 02.04.2016 02:35:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Error 1093 при коррелированном update

deadka написал:

Вопрос, а можно ли как-то пробрасывать m_alias на один уровень глубже?

нет, это получится зависимый from-подзапрос
возможно в будущем их реализуют, но пока увы sad

Неактивен

 

#7 02.04.2016 02:55:59

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Error 1093 при коррелированном update

Нде.. sad. Postgre расслабляет, чо...
Отработывают оба.

CREATE TABLE  movie (
  id int NOT NULL,
  name varchar(255) DEFAULT NULL,
  count_of_like int DEFAULT NULL
);

CREATE TABLE  likes (
  id int NOT NULL,
  movie_id int DEFAULT NULL
);

UPDATE movie bt1 SET id = (SELECT count(*) FROM movie WHERE count_of_like > bt1.count_of_like );
UPDATE movie bt1 SET count_of_like = (SELECT count(*) FROM ( SELECT * FROM likes WHERE movie_id = bt1.id ) t );
 


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson