2016-01-25 2 views
7

У меня есть следующие две таблицы:SQL: таблица Update картированием два столбца друг с другом

 Table A 
+-------------------+ 
|___User___|__Value_| 
| 3  | a  | 
| 4  | b  | 
| 5  | c  | 
|____6_____|__d_____| 



     Table B 
+-------------------+ 
|___User___|__Value_| 
| 1  |  | 
| 4  |  | 
| 5  |  | 
|____9_____|________| 

Моя работа заключается принять user из таблицы А (и их correspondings value), а затем отобразить его в таблице B и вставьте эти значения там. Таким образом, из приведенного выше примера в таблице B должен выглядеть следующим образом после выполнения сценария:

 Table B 
+-------------------+ 
|___User___|__Value_| 
| 1  |  | 
| 4  | b  | 
| 5  | c  | 
|____9_____|________| 

Мой вопрос, как я могу построить SQL запрос, который будет делать это для меня в эффективный способ, если таблица А содержит 300.000 + записи и таблица B содержит 70 000 записей?

ПРИМЕЧАНИЕ: В таблице А User поля не является уникальным и ни один не Value поля. Однако в таблице B оба поля User и Value являются уникальными и не должны отображаться более одного раза. Также не являются первичными ключами для обеих таблиц.

+3

Итак, если у вас есть 2 значения в соответствии с 1 пользователем в b, какое одно из этих значений должно использоваться для обновления? – Mihai

+2

Если в таблице A указано несколько строк для одного и того же 'пользователя', значение' '' этой строки должно быть скопировано в B? –

+0

Хороший вопрос @AlanHadsell - не имеет значения, какая строка скопирована - это может быть либо первое вхождение, либо последнее из всего, что находится в столбце «значение» для таблицы A – user1775598

ответ

7

Может быть это

update table_b as b 
inner join table_a as a on a.User = b.User 
set b.value = a.value 
0

Ваш вопрос не ясно о том, что делать каких-либо значений, которые уже в b. Если вы используете left join, то это будет явно быть установлен в NULL:

update table_b b left join 
     table_a a 
     on a.User = b.User 
    set b.value = a.value; 

Если вы хотите сохранить существующие значения для не матчей, а затем использовать inner join.

Обратите внимание, что это может быть неэффективным, но должно быть нормально, если индекс существует на a(user).

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

+0

Спасибо за подробный ответ. Около 50 тыс. Пользователей, и да много дубликатов (всего 300 тыс. Строк). В настоящее время индексов нет ни на одной из таблиц.Смогу ли я добавить индекс к этим таблицам или это было бы что-то, что я должен был сделать, когда была создана таблица? И что вы имеете в виду под Агрегационным столом a? – user1775598

+0

Лучший индекс для его таблицы находится на 'table_a (user, value)'. –

1

В реальных ситуациях было бы более вероятно, что вы хотите прогнозируемое значение, например наибольшее значение value для любых заданных user. В этом случае вам понадобится

update table_b as b 
inner join (
    select user, max(value) from table_a 
    group by user) as a_max on a.user = b.user 
set b.value = a_max.value 
Смежные вопросы