2015-06-06 3 views
0

Старая база данных, которая использовалась в течение многих лет, наконец достигла того этапа, на котором она должна быть удалена и заменена еще одной подходящей для нужд бизнеса используется. По возможности новая база данных была разработана таким образом, чтобы возможная передача существующих данных из старой в новую базу данных была настолько безболезненной, насколько это возможно. Однако есть несколько таблиц, где мне нужно будет выполнить некоторые обновления, как только начальная передача данных (или, по крайней мере, все простой бит).Обновление каждой строки таблицы с информацией, полученной из других таблиц

Основные операторы обновления в SQL, с которыми я знаком, но повторяю всю таблицу, которую я раньше не делал, и я не уверен в наиболее эффективном способе ее решения.

В качестве примера того, что я хотел бы сделать. Предположим, что таблица A имеет теперь несколько полей, чем исходный. Многие из этих полей дополнений будут содержать информацию о том, что кабина должна быть получена из других таблиц в базе данных. Итак, в таблице A теперь есть поле, которое должно содержать информацию, содержащуюся в двух полях в таблице B. Я хотел бы пройти через каждую строку таблицы a и задать поле x равным конкатенации полей c & d из таблицы b где поле идентичности таблицы b равно значению в поле y таблицы a. В псевдо sql что-то вроде,

For each row in table a 
set field x = (select field c + field d from table b where id = field y) 
next row 

Пробег примерно 8500 строк. Каждая строка имеет действительную запись в поле y, а таблица b имеет id в своем поле id, чтобы соответствовать этим, так что на самом деле это всего лишь пример наиболее эффективного типа SQL-оператора для выполнения такого типа вещей, за которым я после.

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

ответ

0

Если мне не хватает чего-то в вашем вопросе, похоже, что вы хотите сделать простое объединенное обновление, которое может быть выполнено как операция на основе набора, поэтому нет необходимости использовать циклы. Если это так, то этот запрос должен быть то, что вы хотите:

UPDATE a 
SET a.x = CONCAT(b.c, b.d) -- possibly CONCAT(b.c, ' ', b.d) if you want a separator 
FROM TableA a 
JOIN TableB b ON a.y = b.id 
+1

Спасибо, прекрасно работает –

0

Учитывая условия Вы описали, я предлагаю использовать обновление на основе набора, из моего опыта, это было бы самым быстрым. Я использую операции на основе набора, когда это возможно, в отличие от использования курсора или некоторого цикла итерации.

Вы можете взглянуть на this discussion относительно операций на основе операций против обработки строк по отдельности.

Смежные вопросы