Обновить значения таблицы из другой таблицы с тем же именем пользователя - PullRequest
62 голосов
/ 02 октября 2010

У меня есть две таблицы с одним и тем же столбцом с именем user_name со словами table_a, table_b.

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

Ответы [ 3 ]

117 голосов
/ 02 октября 2010

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

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
    )

ОБНОВЛЕНИЕ в sqlite3 не поддерживает предложение FROM, что делает его немного более эффективным, чем в других СУБД.

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

11 голосов
/ 11 декабря 2017

Начиная с версии sqlite 3.15 синтаксис для ОБНОВЛЕНИЕ допускает список имен столбцов в части 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 голосов
/ 30 июля 2016

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

;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)

;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...