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

51

У меня есть две таблицы с одинаковым столбцом с именем 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 ответа

102
Лучший ответ

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

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 и повторно запишите из временного.

  • 4
    Мне пришлось исключить часть table_a из левой части аргумента set, чтобы заставить это работать. Используя ответ выше, это выглядит как column_a_1 = (SELECT table_b.column_b_1 FROM table_b WHERE table_b.user_name = table_a.user_name )
  • 0
    Этот ответ помогает понять более подробно, как копировать ответ, размещенный на stackoverflow.com/questions/17267417/…
Показать ещё 3 комментария
2

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

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

;
  • 1
    Поскольку вышеприведенный поиск ищет конкретные строки (record_id = 2347), нужно будет написать вышеуказанный код 1000 раз, чтобы обновить 1000 строк?
  • 1
    Это кажется многообещающим, но это не сработает, когда вам нужно объединить обе таблицы в общем столбце (например, user_name в исходном вопросе). Вместо этого будут установлены все соответствующие значения в обновляемой таблице на значения только одной записи в исходной таблице. Попытался перечислить общий столбец и добавить условие WHERE , но это не сработало.
Показать ещё 1 комментарий
0

Начиная с 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
   )

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню