Основная причина ошибки 1093
заключается в том, что MySQL не может получить доступ к таблице, которую вы хотите обновить во второй раз, с какой-либо прямой зависимостью от этой таблицы.
Несмотря на то, что вы нашли обходные пути, они просто добавляют слой select
вокруг исходного подзапроса, например, select * from (your original subquery)
, вы пропустили причину, по которой они работают: они используют производную таблицу вместо (зависимого) подзапроса (что и имел в виду @Cheekysoft для неявной временной таблицы в вашем связанном ответе ). Производная таблица не может зависеть от внешнего запроса (поэтому основная проблема исчезла). С ним более или менее обращаются, как с любой реальной таблицей (обратите внимание, например, что необходимо назвать производную таблицу, в вашем случае aa
; см., Например, еще один мой ответ для некоторых других подробности об этом).
Но это также означает, что вы не можете использовать здесь какую-либо зависимость от внешней таблицы, независимо от того, как вы хотите обмануть MySQL. Вы, например, получите unknown column -error, потому что внешний запрос просто недоступен для ссылки на данный момент.
Таким образом, основная стратегия состоит в том, чтобы поместить все строки, которые вам когда-либо понадобятся, в производную таблицу, а затем выполнить команду join
, чтобы выбрать строку, необходимую для обновления фактической строки:
update fact_training_event_tbl
join ( your original select that returns 3 rows ) base
on base.gkey = fact_training_event_tbl.gkey
set course_date = base.course_date
«Внутри» производной таблицы (base
) вы можете делать все, что захотите, и использовать fact_training_event_tbl
так часто, как хотите, но зависимость от external fact_training_event_tbl
закончена » вне "1030 * по on
условию.
Поскольку не только base
является (производной) таблицей, но fact_training_event_tbl
также является (фактической) таблицей, обычно также можно сделать
update fact_training_event_tbl
join fact_training_event_tbl base
on base.gkey = fact_training_event_tbl.gkey + 1
set course_date = base.course_date
В вашем случае это сработало бы, если вы имели в виду "поле gkey, которое является последовательным по первичному ключу" буквально (без пробелов). Но даже если это не так, он должен иллюстрировать аналогию между использованием обычной и производной таблиц в этой ситуации.