Обновить запрос из двух несвязанных таблиц

Мне нужно обновить столбец в таблице. Значение обновления следует извлекать из другой таблицы. Я сделал запрос:

update db1.t1 set location=(select countryName from db1.t1, db2.t2 where t1.num 
between t2.beginNum AND t2.endNum limit 1)

Я получаю следующую ошибку:

Error Code: 1093 You can't specify target table t1 for update in FROM clause.

Затем, когда я удалил имя таблицы t1 из предложения FROM

update db1.t1 set location=(select countryName from db2.t2 where num 
between t2.beginNum AND t2.endNum limit 1)

Запрос работал, но я не уверен, правильно ли он работал. Насколько я знаю, я должен указать обе таблицы в FROM , если я извлекаю из более чем одной таблицы. В двух таблицах, в которых я работаю, нет общего столбца. Но в t1 есть значение, которое может быть найдено между двумя значениями в t2 . Является ли второй запрос абсолютно правильным? Как запрос будет знать, что num после предложения where из первой таблицы? Я боюсь, что я ошибаюсь.

0
nl ja de
У вас есть количество строк, которые изменились после запуска запроса? Похоже, вы не установили условие для таблицы, которую вы фактически обновляете, поэтому это попытается установить каждую запись в местоположении на ту же самую вещь, если ваш подзапрос вернул одну запись (я думаю, что это или ничего не происходит), иначе он упадет из-за несоответствия размеров записей. Также, если вам нужно получить countryNames из 2 таблиц, в этом случае вам нужно будет сделать UNION ALL , чтобы все результаты были в том же столбце.
добавлено автор Paul Stanley, источник
если вы не можете проверить достоверность данных на 100%, вы можете попробовать перейти на SQLFiddle.com и сделать тот же тест, чтобы узнать, работает ли ваш запрос или нет.
добавлено автор jcho360, источник

1 ответы

Эти два вопроса делают что-то другое.

Первая попытка назначить произвольное t2.CountryName для каждого местоположения в t1. Он никогда не будет присваивать значение NULL, потому что существует, вероятно, некоторый t1.num , который соответствует условиям. когда t1.num не соответствует условиям между . Две ссылки на db1.t1 в первом запросе - это разные ссылки, поэтому между таблицами имеется неявное cross join .

Второй - присвоить произвольное t2.CountryName место, где значение num в строке соответствует условию. Для других строк будет назначен NULL.

Я предполагаю, что второй запрос действительно то, что вы хотите сделать.

0
добавлено
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw