Обновить значения таблиц из другой таблицы с тем же именем пользователя

У меня есть две таблицы, с той же самой колонке под названием user_name, говоря table_a, table_b.

Я хочу, скопировать из table_b, column_b_1, column_b2, к table_b1, column_a_1, column_a_2, соответственно, где user_name то же самое, как сделать это в SQL выражение?

Ответ 1

Пока у вас есть подходящие индексы, это должно работать нормально:

UPDATE table_a
SET
      column_a_1 = (SELECT table_b.column_b_1 
                            FROM table_b
                            WHERE table_b.user_name = table_a.user_name )
    , column_a_2 = (SELECT table_b.column_b_2
                            FROM table_b
                            WHERE table_b.user_name = table_a.user_name )
WHERE
    EXISTS (
        SELECT *
        FROM table_b
        WHERE table_b.user_name = table_a.user_name
    )

UPDATE в sqlite3 не поддерживает предложение FROM, что делает это немного больше работы, чем в других СУБД.

Если производительность не является удовлетворительной, другой вариант может заключаться в создании новых строк для table_a, используя команду select и join with table_a во временную таблицу. Затем удалите данные из таблицы_a и повторно запишите из временного.

Ответ 2

Начиная с версии sqlite 3.15, синтаксис UPDATE допускает использование списка имен столбцов в части SET, поэтому запрос можно записать в виде

UPDATE table_a
SET
    (column_a_1, column_a_2) = (SELECT table_b.column_b_1, table_b.column_b_2
                                FROM table_b
                                WHERE table_b.user_name = table_a.user_name )
WHERE
    EXISTS (
       SELECT *
       FROM table_b
       WHERE table_b.user_name = table_a.user_name
   )

который не только короче, но и быстрее

Ответ 3

Существует даже гораздо лучшее решение для обновления одной таблицы из другой таблицы:

;WITH a AS
(
    SELECT
        song_id,
        artist_id
    FROM
        online_performance
)
UPDATE record_performance
SET
    op_song_id=(SELECT song_id FROM a),
    op_artist_id=(SELECT artist_id FROM a)

;