LIMIT
допускается только при обновлении одной таблицы, как объяснено в документации :
Для синтаксиса одной таблицы, [...] если ORDER BY
, строки обновляются в указанном порядке. Предложение LIMIT
устанавливает ограничение на количество строк, которые могут быть обновлены.
Для синтаксиса с несколькими таблицами нельзя использовать ORDER BY
и LIMIT
.
Вы можете переписать запрос, чтобы использовать коррелированный подзапрос вместо соединения:
update subs
set cancellation_date = (
select t2.date
from imp_subscriptionlog t2
where t2.subscription_id = subs.subscription_id and t2.event = 'subscription_cancelled'
)
order by ???
limit 35
Примечания:
вы должны указать в запросе предложение order by
, в противном случае не определено, какие строки будут фактически обновлены
запрос неявно предполагает, что всегда есть только одна соответствующая строка в imp_subscriptionlog
для каждой строки в subs
; если это не так, тогда вы должны также order by
и limit 1
в подзапросе или использовать агрегирование
, мы также можем убедиться, что есть совпадение перед обновлением, добавив предложение where
к запросу
Вот «более безопасная» версия запроса, которая обновляется до максимального значения даты, доступного в другой таблице, но не изменяет строки, которые имеют нет совпадений:
update subs
set cancellation_date = (
select max(t2.date)
from imp_subscriptionlog t2
where t2.subscription_id = subs.subscription_id and t2.event = 'subscription_cancelled'
)
where exists (
select 1
from imp_subscriptionlog t2
where t2.subscription_id = subs.subscription_id and t2.event = 'subscription_cancelled'
)
order by ???
limit 35